模式定义
提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。
模式结构
代码实现
public interface Human {
void print();
}
public class Man implements Human {
public void print() {
System.out.println("我是男人");
}
}
public class Woman implements Human {
public void print() {
System.out.println("我是女人");
}
}
//这里也可以不用传入参数创建对象,可以使用读取配置,通过反射创建对象
public class HumanFactory {
public Human createHuman(String type){
if("man".equals(type)){
return new Man();
}else if("woman".equals(type)){
return new Woman();
}else {
return null;
}
}
}
public class Client {
public static void main(String[] args) {
HumanFactory factory = new HumanFactory();
Human man = factory.createHuman("man");
man.print();
}
}
模式的优缺点
优点
封装
使组件外部能真正面向接口编程。解耦
通过简单工厂,实现了客户端和具体实现类的解耦。
缺点
可能增加客户端的复杂度
不方便扩展子工厂
私有化简单工厂的构造方法,使用静态方法来创建接口,也就不能通过写简单工厂类的子类来改变创建接口的方法的行为了。
思考
模式本质:选择实现
简单工厂的重点在选择,实现是已经做好了的。就算实现再简单,也要由具体的实现类来实现,而不是在简单工厂里面来实现。简单工厂的目的在于为客户端来选择相应的实现,从而使得客户端和实现之间解耦。
难点在“如何选择”实现,参数传递可以是静态的参数,也可以是动态的参数。比如:运行期间。由工厂去读取某个内存的值,或者去读取数据库中的值,然后根据这个值来选择具体的实现等。