简单工厂模式

工厂模式是为了解耦可以将对象的创建和使用分离**,如果不分离,不但违反了设计模式的开闭原则,需要使用另一个子类的话,需要修改源代码 ,**把对象的创建和使用的过程分开。

image.png

如果这个时候想要扩展或者删除pizza类,那么必须修改代码:
image.png

封装创建代码的对象

image.png
方法返回一个类实例给调用者

这个时候,创建一个对象就可以变成现在的代码:
image.png

类图

披萨店对象含有比萨工厂对象,披萨工厂对象里面有披萨对象

image.png

工厂模式

如果现在又三家比萨店,纽约风味披萨店、芝加哥风味店、加州风味店。
这样:
image.png

工厂方法模式

通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。

  • 创建者类Creator
    • 是一个抽象的创建者类
    • 定义了一个抽象的工厂方法,并不实现工厂方法,而是让子类实现这个方法来制造产品。
    • 创建者类一般包含依赖于抽象产品的代码,而这些抽象产品由子类制造。创建者不需要真的知道制造哪种的具体产品。
    • 定义了一个创建对象的接口,由子类决定要实例化的类是哪一个。把类的实例化推迟到了子类
    • 在抽象的Creator中,任何其他的方法,都可能使用到这个工厂方法所制造出来的产品,但只有子类真正实现这个工厂方法并创建产品。
    • 编写Creator类的时候,并不知道实际创建的产品是哪一个;选择哪一个子类进行生产,自然决定了实际创建的产品是什么。
  • 产品类
    • 具体的产品

image.png

  1. 以披萨店为例子
  2. public abstract class PizzaStore(){
  3. // 订购披萨
  4. public Pizza orderPizza(){
  5. // 使用抽象方法创建披萨,(实际是子类去具体创建)
  6. Pizza pizza = createPizza();
  7. pizza.prepare();
  8. pizza.bake();
  9. pizza.box();
  10. return pizza();
  11. }
  12. public abstract Pizza createPizza(String type); // 并不实现工厂方法
  13. }
  14. // 具体的披萨工厂
  15. public class NewYorkPizzaStore extend PizzaStore{
  16. public Pizza createPizza(String type){
  17. if(type.equals("chess")) return new NYChessPizza();
  18. if(type.equals("clam")) return new NYClamPizza();
  19. return null;
  20. }
  21. }
  22. 用户调用的时候
  23. NewYorkPizzaStore nyStore = new NewYorkPizzaStore();
  24. nyStore.orderPizza("chess")-->{nyStore.createPizza();pizza.prepare(); pizza.bake(); pizza.box();}

抽象工厂模式

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

  • 允许客户使用抽象的接口来创建一组相关的产品,而不知道实际产出的具体产品是什么。使客户从具体产品中解耦。
  1. 抽象工厂
    1. 定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含一组方法来生产产品。
  2. 具体工厂
    1. 每个具体工厂实现不同的产品族,要创建一个产品,客户只需要使用其中一个工厂而完全不需要实例化任何产品对象。

image.png

区别

工厂方法

  • 使用继承
  • 实例化具体类

抽象工厂

  • 使用组合
  • 可以把一群相关的产品集合起来