工厂方法(Factory Method)模式
- 工厂方法模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
- 在工厂方法模式中,==核心的工厂类不再负责所有产品的创建,二十将具体创建工作交给子类去做。==这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使- 得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
- 在Factory Method模式中,工厂类与产品类往往具有平行的等级结构,他们之间一一对应。
- 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且部分克服了它的缺点。
工厂方法模式角色
- 抽象工厂(Creator)角色 是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
- 具体工厂(Concrete Creator)角色 这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
- 抽象产品(Product)角色 工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
- 具体产品(Concrete Product)角色 这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,他们之间一一对应。
优点:
- 一个调用者想通过工厂创建一个对象,只要知道其名称。
- 扩展性高,如果想增加一个产品,添加一个产品类和产品工厂就可以
- 屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
应用场景:
- 客户端不知道它所需要的对象的类。在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建,可将具体工厂类的类名存储在配置文件或数据库中。
- 抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时子类对象将覆盖父类对象,从而使得系统更容易扩展。
实现:
UML
代码语言:javascript复制public interface Product
{
public void productMethod();
}
代码语言:javascript复制public class ConcreteProduct implements Product
{
public void productMethod(){
concreteDoSomething;
}
}
代码语言:javascript复制public interface Factory {
public Product factoryMethod();
}
代码语言:javascript复制public class ConcreteFactory implements Factory {
public Product factoryMethod() {
return new ConcreteProduct();
}
代码语言:javascript复制Factory factory;
factory = new ConcreteFactory();
Product product;
product= factory.factoryMethod();