-
工厂模式一定要面向接口编程,将工厂类设计为接口类型,将createPizzaf()方法放在子类中,那么子类进行createPizza方法的具体实现。
-
工厂方法模式定义了一个创建对象的接口,但有子类决定要实例化哪一个类。工厂方法模式让实例化推迟到子类。
-
工厂模式数据建造者模式中的类创建型。
-
工厂模式的UML图
-
工厂模式是面向接口编程的动态工厂模式。
-
工厂方法模式是简单工厂模式的延伸。在工厂方法模式中,核心工厂类不再负责产品的创建,而是将具体的创建工作交给子类去完成。也就是核心工厂仅仅提供创建的接口,具体的实行方法交给继承它的子类去完成。当系统需要增加其他新的对象的时候,只需要添加一个具体的产品和它的创建工厂即可,不需要对原工厂进行任何的修改,也很好的符合了"开闭环原则"。
-
工厂模式的优点:
- 在工厂方法中,用户只需要知道所需要的产品的具体工厂,无需关心具体的创建过程,甚至不需要具体产品的类名。
- 在系统增加新产品的时候,只需要条件一个具体产品类和一个对应的实现工厂,无需对原工厂进行任何修改,很好的符合了"开闭环原则"。
-
工厂模式的缺点:
- 每次增加产品时都需要新增加一个具体的类和对象实现工厂,使得系统中类的格式成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
-
工厂模式的实现过程
-
创建一个抽象类
/** * 抽象产品类 */ public abstract class Pizza { public abstract void prepare(); public abstract void create(); public abstract void complete(); }
-
创建一个具体类
/** * 蔬菜披萨 */ public class PizzaVegg extends Pizza { @Override public void prepare() { System.out.println("准备蔬菜"); } @Override public void create() { System.out.println("制作蔬菜"); } @Override public void complete() { System.out.println("制作蔬菜成功"); } }
-
创建抽象工厂类
/** * 抽象工厂类,工厂设计模式的核心思想类(面向接口编程) */ public interface Factory { Pizza createPizza(String type); }
-
创建具体工厂类
public class PizzaStore1 implements Factory { public void orderPizza(String type){ System.out.println("开始预定披萨...类型是"+type); Pizza pizza = createPizza(type); pizza.prepare(); pizza.create(); pizza.complete(); System.out.println("披萨制作完成..."); } /** * 不管有多少的披萨种类,都是由自己控制的,如果该店面新加了产品, * 只需要修改自己披萨店的代码即可,而不会影响其他披散店的正常运行 * @param type * @return */ @Override public Pizza createPizza(String type) { Pizza pizza = null; if(type.equals("VEGG")){ pizza = new PizzaVegg(); } return pizza; } }
-
-
工厂模式的使用场景:
- 一个类不知道他所需要的类对象,在工厂方法模式中,不需要知道具体产品的类名,只需要知道创建它的具体工厂即可。
- 一个类通过其子类来指定创建的那个对象。在工厂方法模式中,对用抽象工厂类只需要提供一个创建产品的接口,尤其子类来确定具体要创建的对象,在程序运行时,子类将覆盖父类对象,是的系统易扩展。
- 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时无需关心是哪一个工厂子类创建产品子类,需要时在动态指定。