简单工厂模式

在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,并且提供一个「工厂类」去创建对象,只需要告诉工厂我需要什么,比如需要一辆汽车,去工厂提货,不用去关心汽车是怎么做出来的。

适用场景:创建复杂对象 & 希望隐藏「创建类的代码逻辑」 优点:无需关心对象内部实现逻辑,需要则通过工厂创建即可 缺点:违背开闭原则,有新的产品加入时,就需要修改工厂类,具体产品和工厂耦合高,扩展性低。

参考文档:https://blog.csdn.net/qq_27825451/article/details/84235974

以生产三种水果为例,定义三类水果,分别是:苹果、香蕉、橘子
首先定义一个工厂类FactorySimple,创建一个静态方法,根据输入的类型,返回不同的对象

  1. # 定义三类水果
  2. class Apple(object):
  3. """苹果"""
  4. def __repr__(self):
  5. # 具体实现逻辑
  6. return "苹果"
  7. class Banana(object):
  8. """香蕉"""
  9. def __repr__(self):
  10. # 具体实现逻辑
  11. return "香蕉"
  12. class Orange(object):
  13. """橘子"""
  14. def __repr__(self):
  15. # 具体实现逻辑
  16. return "橘子"
  17. class FactorySimple:
  18. """简单工厂模式"""
  19. @staticmethod
  20. def get_fruit(fruit_name):
  21. if 'a' == fruit_name:
  22. return Apple()
  23. if 'b' == fruit_name:
  24. return Banana()
  25. if 'c' == fruit_name:
  26. return Orange()
  27. else:
  28. print("没有这种水果")
  29. if __name__ == '__main__':
  30. # 简单工厂
  31. instance_a = FactorySimple.get_fruit('a')
  32. instance_b = FactorySimple.get_fruit('b')
  33. instance_c = FactorySimple.get_fruit('c')
  34. print(instance_a)
  35. print(instance_b)
  36. print(instance_c)

工厂方法模式

相比简单工厂模式,工厂方法则是提供了一系列的工厂创建类,每个「产品」都有一个工厂,这些工厂又遵循一个工厂「接口」(总工厂),只不过是重写了「接口」中的方法。

优点:解决了简单工厂模式 违背闭开原则的 缺点 实现套路:

  1. 定义每个产品类
  2. 定义一个创建产品类的「抽象接口」,实现「生产方法」
  3. 分别定义每个产品的工厂类,并重写「抽象接口」的「生产方法」

参考文章:https://blog.csdn.net/qq_27825451/article/details/84246759

首先定义三类水果Apple、Banana、Orange,创建一个抽象公共工厂类AbstractFactory,并定义一个生产方法get_fruit,接着,创建抽象工厂类的3个子类AppleFactory、BananaFactory、OrangoFactory,并重写方法,创建一个实例对象并返回。

  1. # 工厂方法
  2. import abc
  3. # 定义三类水果
  4. class Apple(object):
  5. """苹果"""
  6. def __repr__(self):
  7. return "苹果"
  8. class Banana(object):
  9. """香蕉"""
  10. def __repr__(self):
  11. return "香蕉"
  12. class Orange(object):
  13. """橘子"""
  14. def __repr__(self):
  15. return "橘子"
  16. class AbstractFactory(object):
  17. """公共抽象工厂"""
  18. __metaclass__ = abc.ABCMeta
  19. @abc.abstractmethod
  20. def get_fruit(self):
  21. # 公共抽象方法
  22. pass
  23. # 工厂子类创建对象,不修改原有代码,需要生产不同产品则创建不同工厂子类
  24. class AppleFactory(AbstractFactory):
  25. """生产苹果"""
  26. def get_fruit(self):
  27. return Apple()
  28. class BananaFactory(AbstractFactory):
  29. """生产香蕉"""
  30. def get_fruit(self):
  31. return Banana()
  32. class OrangoFactory(AbstractFactory):
  33. """生产橘子"""
  34. def get_fruit(self):
  35. return Orange()
  36. if __name__ == '__main__':
  37. # 工厂方法
  38. instance_apple = AppleFactory().get_fruit()
  39. instance_banana = BananaFactory().get_fruit()
  40. instance_orange = OrangoFactory().get_fruit()
  41. print(instance_apple,instance_banana,instance_orange)

工厂方法练习:

  1. from abc import ABC, abstractmethod
  2. """
  3. 工厂方法
  4. eg:
  5. 需求:生产手机,手机类型有苹果、小米、华为等等
  6. 需要什么? 工厂-->手机生产线(一个具体的工厂对应一个具体类型的手机生产线)
  7. """
  8. # 1、创建一个抽象工厂,可以有生产手机的功能(具体生产啥类型不知道)
  9. class AbstractFactory(ABC):
  10. @abstractmethod
  11. def product_phone(self):
  12. """有生产手机功能"""
  13. pass
  14. # 2、创建生产线
  15. class ProductionLine(ABC):
  16. @abstractmethod
  17. def make_phone(self):
  18. """制作手机"""
  19. pass
  20. # 3-1、创建苹果工厂,只生产苹果手机
  21. # 3-2、创建华为工厂,只生产华为手机
  22. class IphoneFactory(AbstractFactory):
  23. def product_phone(self):
  24. return Iphone().make_phone()
  25. class HuaWeiFactory(AbstractFactory):
  26. def product_phone(self):
  27. return HuaWei().make_phone()
  28. # 4-1、创建苹果生产线
  29. # 4-2、创建华为生产线
  30. class Iphone(ProductionLine):
  31. def make_phone(self):
  32. print("产出苹果手机")
  33. class HuaWei(ProductionLine):
  34. def make_phone(self):
  35. print("产出华为手机")
  36. def client(factory):
  37. return factory
  38. if __name__ == "__main__":
  39. iphone = client(IphoneFactory()) # 选择苹果工厂
  40. iphone.product_phone() # 产出手机(只能是苹果手机) output:产出苹果手机
  41. huawei = client(HuaWeiFactory()) # 选择华为工厂
  42. huawei.product_phone() # 产出手机(只能是华为手机) output:产出苹果手机

抽象工厂

如果出现很多产品,即会出现很多类的时候,并且这些类可以进行很好的分组,最为合适使用抽象工厂模式。 根据各个类的信息进行分组,每个组由一个工厂类实现。

实现四步法:

  1. 定义产品类(只定义方法,不具体实现,抽象产品)
  2. 定义具体的产品类,重写类方法(业务逻辑)
  3. 定义抽象工厂(定义生产方法,不具体实现)以及每个产品的工厂,重写「抽象工厂」的生产方法
  4. 定义一个生产工厂类(超级工厂)去决定生产哪个类的实例
  1. """
  2. 场景:假如生产一台手机,需要触摸屏、机壳、充电线,不同型号的手机有不同的触摸屏、不同的机壳、不同的充电线
  3. 抽象工厂模式结构
  4. 1、抽象产品:抽象触摸屏类、机壳类、充电线类
  5. 2、具体产品:具体的触摸屏、机壳、充电线
  6. 3、抽象工厂:创造手机工厂类
  7. 4、具体工厂:创造不同型号的手机使用不同的具体工厂
  8. 5、客户端
  9. 相比工厂方法模式,抽象工厂模式生产的是 「一套对象」 比如生成手机需要触摸屏、机壳...等一套对象, 工厂方法生产的是 「一个对象」
  10. """
  11. from abc import ABCMeta, abstractmethod
  12. # 第一步:定义不同产品的抽象类,通过抽象产品来创建具体的产品类
  13. class ChuMoPing():
  14. """定义触摸屏抽象类"""
  15. def show_chumoping(self):
  16. pass
  17. # 第二步:定义具体的产品类,这里我们定义了部分产品类:苹果触摸屏、苹果机壳、安卓触摸屏
  18. class IhponeChuMoPing(ChuMoPing):
  19. """苹果触摸屏"""
  20. def __init__(self, size=11):
  21. self.size = size
  22. def show_chumoping(self):
  23. if self.size > 11:
  24. print("这屏幕是最新的苹果屏幕")
  25. print("这屏幕是苹果11的屏幕")
  26. class AndroidChuMoPing(ChuMoPing):
  27. """ 安卓触摸屏 """
  28. def __init__(self, version = 10):
  29. self.version = version
  30. def show_chumoping(self):
  31. if self.version > 10:
  32. print("这屏幕是最新的苹果屏幕")
  33. print("这屏幕是安卓版本10的屏幕")
  34. # 第三步:定义抽象工厂类,来创建这些手机,不管你要创建什么型号的手机,都继承自这个类
  35. class MakePhoneFactory(metaclass=ABCMeta):
  36. """生产手机的抽象工厂类"""
  37. @abstractmethod
  38. def make_chumoping(self):
  39. """创造触摸屏抽象方法"""
  40. pass
  41. # 第四步:定义具体工厂类,在这个类中,我们分别实现抽象父类的「创造」方法,为不用手机机型选不用的产品
  42. class MakeChuMoPingFactory(MakePhoneFactory):
  43. """触摸屏具体工厂"""
  44. def make_chumoping(self, name):
  45. if name == "iphone":
  46. return IhponeChuMoPing()
  47. elif name == "android":
  48. return AndroidChuMoPing()
  49. # 第五步: 定义一个生产工厂的类(超级工厂)
  50. class MyIphoneProducer(object):
  51. def get_factory(self, name):
  52. if name == "chumoping":
  53. return MakeChuMoPingFactory()
  54. if __name__ == "__main__":
  55. print("###############################")
  56. # 做一部苹果手机
  57. phone = MyIphoneProducer()
  58. # 制作产品:苹果手机零件
  59. chumoping = phone.get_factory('chumoping')
  60. make_chumoping = chumoping.make_chumoping(name="iphone")
  61. # 展示新创建的手机
  62. make_chumoping.show_chumoping()


工厂模式总结

抽象工厂是对一个系列的集中式生产,对不同系列的分散式生产,类型的创建式围绕「超级工厂」创建的

工厂方法模式 抽象工厂模式
针对一个产品 针对多个产品
一个抽象产品类 多个抽象产品类
派生出多个具体产品类 每个抽象产品可以派生出多个具体产品类
一个抽象工厂类,可以派生出多个具体工厂类 一个抽象工厂类,可以派生出多个具体工厂类
每个具体工厂类只能创建一个具体产品类实例 每个具体工厂类可以创建多个具体产品类的实例