什么是工厂模式

所谓的工厂模式,是设计模式中比较常用的,这种类型的设计模式

在这种模式下,不会暴露创建逻辑,只是通过某个标识来确定实例化哪个工厂实例

简单的举个例子,如果你要买一辆汽车,不用知道他是怎样做出来的,只需要把参数传递进去,到时候来提车就好了。

无论是车还是什么,都不用管工厂内部是怎样实现的,只需要将参数传进去就可以

工厂模式从简到难,分为简单工厂模式,工厂方法模式以及抽象工厂模式

简单工厂模式

简单工厂模式其实并不算是一种设计模式,更多的时候更像是一种编程习惯

定义一个工厂类,根据传入的参数返回不同的实例,被创建的实例具有共同的父类或接口

现实生活中,工厂是负责生产产品的;同样在设计模式中,简单工厂模式我们可以理解为负责生产对象的一个类,称为“工厂类”。

再举个栗子,假如,你要生产瓶子,客户说要什么样的瓶子,你就拿着这个瓶子的参数,去该瓶子的生产车间去取。

# 定义三个具体的工厂,他们用来生产具体的东西
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,但比较好理解