在前面博主写的文章:设计模式-----简单工厂模式,发现简单工厂模式存在一系列问题:html
为了解决上述的问题,咱们又使用了一种新的设计模式:工厂方法模式java
工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,经过定义工厂父类负责定义建立对象的公共接口,而子类则负责生成具体的对象数据库
将类的实例化(具体产品的建立)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(建立)哪个类设计模式
工厂一旦须要生产新产品就须要修改工厂类的方法逻辑,违背了“开放 - 关闭原则ide
组成(角色) | 关系 | 做用 |
---|---|---|
抽象产品(Product) | 具体产品的父类 | 描述具体产品的公共接口 |
具体产品(Concrete Product) | 抽象产品的子类;工厂类建立的目标类 | 描述生产的具体产品 |
抽象工厂(Creator) | 具体工厂的父类 | 描述具体工厂的公共接口 |
具体工厂(Concrete Creator) | 抽象工厂的子类;被外界调用 | 描述具体工厂;实现FactoryMethod工厂方法建立产品的实例 |
abstract class Factory{ public abstract Product Manufacture(); }
abstract class Product{ public abstract void Show(); }
//具体产品A类 class ProductA extends Product{ @Override public void Show() { System.out.println("生产出了产品A"); } } //具体产品B类 class ProductB extends Product{ @Override public void Show() { System.out.println("生产出了产品B"); } }
//工厂A类 - 生产A类产品 class FactoryA extends Factory{ @Override public Product Manufacture() { return new ProductA(); } } //工厂B类 - 生产B类产品 class FactoryB extends Factory{ @Override public Product Manufacture() { return new ProductB(); } }
//生产工做流程 public class FactoryPattern { public static void main(String[] args){ //客户要产品A FactoryA mFactoryA = new FactoryA(); mFactoryA.Manufacture().Show(); //客户要产品B FactoryB mFactoryB = new FactoryB(); mFactoryB.Manufacture().Show(); } }
生产出了产品A 生产出了产品B
简单工厂模式须要修改工厂类的判断逻辑ui
简单工厂中的工厂类存在复杂的switch逻辑判断设计
简单工厂模式的工厂类使用静态工厂方法code
总结:htm
工厂模式能够说是简单工厂模式的进一步抽象和拓展,在保留了简单工厂的封装优势的同时,让扩展变得简单,让继承变得可行,增长了多态性的体现对象
虽然保证了工厂方法内的对修改关闭,但对于使用工厂方法的类,若是要更换另一种产品,仍然须要修改实例化的具体工厂类
一个具体工厂只能建立一种具体产品