什么是工厂模式
所谓的工厂模式,是设计模式中比较常用的,这种类型的设计模式
在这种模式下,不会暴露创建逻辑,只是通过某个标识来确定实例化哪个工厂实例
简单的举个例子,如果你要买一辆汽车,不用知道他是怎样做出来的,只需要把参数传递进去,到时候来提车就好了。
无论是车还是什么,都不用管工厂内部是怎样实现的,只需要将参数传进去就可以
工厂模式从简到难,分为简单工厂模式,工厂方法模式以及抽象工厂模式
简单工厂模式
简单工厂模式其实并不算是一种设计模式,更多的时候更像是一种编程习惯
定义一个工厂类,根据传入的参数返回不同的实例,被创建的实例具有共同的父类或接口
现实生活中,工厂是负责生产产品的;同样在设计模式中,简单工厂模式我们可以理解为负责生产对象的一个类,称为“工厂类”。
再举个栗子,假如,你要生产瓶子,客户说要什么样的瓶子,你就拿着这个瓶子的参数,去该瓶子的生产车间去取。
# 定义三个具体的工厂,他们用来生产具体的东西
class A:
def __init__(self):
self.name = 'A瓶子'
class B:
def __init__(self):
self.name = 'B瓶子'
class C:
def __init__(self):
self.name = 'C瓶子'
# 工厂类
class factory():
def example(self,name):
if name=='A':
s = A()
print(s.name)
elif name == 'B':
s = B()
print(s.name)
elif name == 'C':
s = C()
print(s.name)
w = factory()
w.example('B')
可以看到,只需要在工厂factory
中,传入你想要什么瓶子,他就可以通过内部方法实例化某个工厂,从而达到你想要的某个东西
工厂模式
工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。
以上面的例子为例,假如要再多一个D瓶子,除了要新建一个D类,还要修改工厂类中的代码,这样就违背了软件设计中的开闭原则,即再扩展新的类时,尽量不要修改原有的代码
说的再简单点,就是工厂类被具体的工厂继承
# 工厂类
class factory():
@staticmethod
def example(self):
pass
class A(factory):
def __init__(self):
self.name = 'A瓶子'
def example(self):
print(self.name)
class B(factory):
def __init__(self):
self.name = 'B瓶子'
def example(self):
print(self.name)
class C(factory):
def __init__(self):
self.name = 'C瓶子'
def example(self):
print(self.name)
class D(factory):
def __init__(self):
self.name = 'D瓶子'
def example(self):
print(self.name)
# 无论你加了多少个工厂,只需要实例化对应的那个具体工厂
w = D()
w.example()
这样做的好处就是,在工厂类里,无需改动任何代码,只需要在需要的时候实例化某个具体工厂即可,便于维护
抽象工厂
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
抽象工厂模式中有工厂和产品簇的概念。而一簇的产品都是成套出现的。比如现在要给每个士兵发一套武器,包括枪和子弹。步枪和步枪子弹,手枪和手枪子弹。生产步枪的工厂就是步枪工厂,而生产手枪的工厂就是手枪工厂。步枪工厂和手枪工厂都是工厂,这就是一种抽象工厂的例子
用一个简单的代码来实现:
import abc
# 工厂类
class factory():
@staticmethod
def Rifle(self):
pass
def Pistol(self):
pass
# M4工厂
class M4(category):
def Rifle(self):
return M4Rifle()
def Pistol(self):
return M4Pistol()
# AK工厂
class AK(category):
def Rifle(self):
return AKRifle()
def Pistol(self):
return AKPistol()
# M4工厂
class M4Rifle():
def __repr__(self):
return 'M4A1步枪'
class M4Pistol():
def __repr__(self):
return 'M4A1手枪'
class AKRifle():
def __repr__(self):
return 'AK47步枪'
class AKPistol():
def __repr__(self):
return 'AK47手枪'
w = M4().Rifle()
print(w)
进入工厂类,无论是要AK系列的,还是
M4
系列的,都只实例化那个类就可以了,因为,无论是M4
还是AK都能生产该类的手枪和步枪虽然我也不知道他们是不是生产手枪
嗯…再画个图吧,low归low,但比较好理解

- Post link: https://www.godhearing.cn/gong-han-mo-shi/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.