概念
定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象;
工厂方法使一个产品类的实例化延迟到其工厂的子类。
别名
虚构造器
适用性
- 当一个类不知道它所必须创建的对象的类的时候;
- 当一个类希望由它的子类来指定它所创建的对象的时候;
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将由哪一个帮助子类是代理者这一信息局部化的时候;
结构
引入
场景仍然使用我们在之前简单工厂提到的场景;
类图如下
代码如下
package coffee_factory;
public abstract class Coffee {
public abstract String getCoffeeName();
}
---
package coffee_factory;
public class ACoffee extends Coffee {
@Override
public String getCoffeeName() {
return "A咖啡";
}
}
---
package coffee_factory;
public class BCoffee extends Coffee {
@Override
public String getCoffeeName() {
return "B咖啡";
}
}
package coffee_factory;
public interface CoffeeFactory {
Coffee createCoffee();
}
---
package coffee_factory;
public class ACoffeeFactory implements CoffeeFactory{
@Override
public Coffee createCoffee() {
return new ACoffee();
}
}
---
package coffee_factory;
public class BCoffeeFactory implements CoffeeFactory{
@Override
public Coffee createCoffee() {
return new BCoffee();
}
}
package coffee_factory;
import simple_factory.EasyCoffeeFactory;
import java.lang.reflect.InvocationTargetException;
public class Store {
private CoffeeFactory coffeeFactory;
public Store(CoffeeFactory coffeeFactory) {
this.coffeeFactory = coffeeFactory;
}
public Coffee orderCoffee() {
return coffeeFactory.createCoffee();
}
}
从以上编写的代码我们可以解决简单工厂(不使用配置文件的方式)违背的开闭原则,这里就解决了;
要增加新的产品也只需要添加新的产品类以及工厂类即可,不需要修改其他部分的代码;
优点
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
- 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
缺点
- 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度;
优化——避免创建过多的工厂
在Java中好像这种方法不能直接用,需要绕下圈子,我还在摸索;
这种方法来自《设计模式》这本书;
如下