工厂方法模式

为什么引入工厂方法模式?

当我们需要创建多个实例的时候,而这些类又是有着公共的方法,区别就是实现的具体操作不同,我们需要专门为这些类创建实例,但是,如果我们没有创建这些的类的权限的时候,(并不是说我们真没有new方法,而是外在的因素)我们需要找一个可以帮我们生产对象的工具,这个听起来和代理模式有些相似,但是工厂模式也是工厂代替我们生产我们需要的实例,工厂模式生成的对象之间是相似的,都是实现相同接口的类。

同时对于需求来说,当我们想创建某个实例,但是我们只知道他的某个特性,对于具体的信息我们又不知道,我们需要一个根据我们知道的请求,帮助我们创建一个对象,实现具体的细节帮,这个角色就是工厂模式。

工厂方法模式是什么?

定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

工厂方法模式的核心思想?

存在一个公共的接口,多个实现类实现这个接口,存在一个工厂类,这个类根据不同的参数创建不同的实现类。

具体案例?

某个学校需要一套校服,校服分为男士校服,和女士校服,将这个任务交给厂商,具体的生产交给厂商实现,学校只需要告诉生产商男士穿还是女士穿。

UML:

具体代码:

package com.dong.Factory;

public interface Clothers {
	public void toSay();
}
package com.dong.Factory;

public class ManType implements Clothers{
	@Override
	public void toSay() {
		System.out.println("I am super man");
	}
}
package com.dong.Factory;

public class WomanType implements Clothers {
	@Override
	public void toSay() {
		System.out.println("I am super Girl");
	}
}package com.dong.Factory;
/**
 * 
 * 运行结果:
 * I am super man
   I am super Girl
 * @author liuD
 *
 */
public class Factory {
	public static Clothers createClother(String type) {
		if( type.toLowerCase().equals("man"))
			return new ManType();
		else if( type.toLowerCase().equals("woman"))
			return new WomanType();
		else {
			System.out.println("please input the Correct String ");
			return null;
		}
	}
	public static void main(String[] args) {
		Clothers manClother = Factory.createClother("man");
		manClother.toSay();
		
		Clothers womenClother = Factory.createClother("woman");
		womenClother.toSay();
	}
}

优点

具体的实现由工厂代替,请求者只需要调用工厂的创建方法。

横向实现比较容易。要创建一个新的类,但是方法和原来的相同,只不过内容不同,这个时候,只需要实现公共接口即可,工厂就可以实现这个实例的创建。

缺点

当需要改变需求,创建具有其他操作的实例的时候,不仅需要改动接口,还需要改动已经实现的类,扩展不方便,只能创建具有相同操作的实例,

使用场景

当需要灵活的,可扩展的框架时,可以考虑采用工厂模式,

当实例对象的具体创建权不在类本身,而实例对象之间又有相同的操作,则可以使用工厂方法根据特定的条件来创建具体的实例。