工厂方法模式
- 简单工厂模式:
- 工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
- 但是在我们添加功能的时候,就要修改原有的工厂类去添加分支判断条件,即不但扩展开放,修改也开放了,违背了软件设计中的开放-封闭原则。
- 工厂方法出现。
工厂方法模式
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
- Product接口:定义工厂方法所创建的对象的接口
- ConcreteProduct:具体的产品,实现了Product接口
- Creator:声明工厂方法,该方法返回一个Product类型的对象
- ConcreteCreator:重定义工厂方法以返回一个ConcreteProduct实例
- 工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在,即工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。
书中的例子
class LeiFeng{
public void Sweep(){...};
public void Wash(){...};
public void Buf(){...};
}
class Undergraduate extends LeiFeng(){}
class Volunteer extends LeiFeng(){}S
class SimpleFactory{
public static LeiFeng CreateLeiFeng(String type){
LeiFeng result = null;
switch(type){
case "...":
result = new Undergraduate();
break;
case "...":
result = new Volunteer();
break;
}
return result;
}
}
LeiFeng StudentA = SimpleFactory.CreateFactory("...");
StudentA.Sweep();
LeiFeng StudentB = SimpleFactory.CreateFactory("...");
StudentB.Wash();
LeiFeng StudentC = SimpleFactory.CreateFactory("...");
StudentC.Buy();
- 使用简单工厂模式时,需要在任何实例化的时候都要写出该工厂
interface IFactory{ LeiFeng CreateLeiFeng();}
class UndergraduateFactory implements IFactory{
public LeiFeng createLeiFeng(){
return new Undergradute();
}
}
class VolunteerFactory implements IFactory(){
public LeiFeng createLeiFeng(){
return new Volunteer();
}
}
IFactory factory = new UndergraduateFactory();
LeiFeng student = factory.CreateLeiFeng();
student.Sweep();
student.Wash();
student.Buy();
- 工厂方法克服了简单工厂违背开放-封闭的缺点,又保持了封装对象创建过程的优点