天天看点

python设计模式(一):工厂方法与抽象工厂及应用场景

工厂方法与抽象工厂是否傻傻分不清,力求以最简单和最直接的方式来理解模式设计,毕竟模式的初衷是化繁为简,就该用最简单的方式来理解。

示例code:

工厂模式

# -*- coding:utf-8 -*-


class A:


    def __init__(self):

        self.word = "运行A"


    def run(self):

        print(self.word)


class B:


    def __init__(self):

        self.word = "运行B"


    def run(self):

        print(self.word)


def Interface(classname):

    """

    工厂模式接口函数

    :param classname:

    :return:

    """

    run = dict(A=A, B=B)

    return run[classname]()


if __name__ == '__main__':

    test1 = Interface('A')

    test1.run()

    test2 = Interface('B')

    test2.run()

    

    结果:

   运行A

   运行B

   
           

抽象工厂模式:

# -*- coding:utf-8 -*-


class A:


    def __init__(self):

        self.word = "运行A"


    def run(self):

        print(self.word)


class B:


    def __init__(self):

        self.word = "运行B"


    def run(self):

        print(self.word)


class Interface:

    """

    抽象工厂模式接口类

    :param classname:

    :return:

    """

    def __init__(self, classname=None):

        self.test = classname


    def run(self):

        self.test().run()


if __name__ == '__main__':

    test1 = Interface()

    test1.test = A

    test1.run()

    test1.test = B

    test1.run()


    结果:

   运行A

   运行B
           

抽象工厂:创建一系列相关或相互依赖抽象出来的的对象接口Interface,不需要具体指明实例化A类或B类

工厂方法:定义一个用于创建对象的接口函数Interface,让子类决定实例化哪一个类A或者B

抽象工厂、工厂方法异同比较:抽象工厂实例化的类在接口方法里已经通过字典方式例举出来了,也就是不是实例化A就是B,但是抽象工厂实例化的类未知,可以在抽象接口类里传入A或者B,也可以新建一个C类传入。

类本身就是对象的抽象,但是抽象工厂是对类的抽象,相同方法、相同属性的归并。

如上图,抽象工厂有两个方法生产车架和制造轮胎,但是他没有指定是生产那种牌子的,上图有两种牌子:飞鸽自行车、永久自行车,也就可以增加一个凤凰自行车等等。工厂模式里面就指定了飞鸽厂和永久厂,并且这两个厂只能生产各自对应的轮胎。