创建型设计模式-----python 的工厂模式

 

优点:

都是为了方便客户端,以及降低维护成本,因为代码都是松耦合的。

我的总结:

总结:就是有一个类,这个类不是实现具体的对象,而是一些将方法(动作)集成到一个类里面,这里的成员函数就是比如make啊,product的什么的,这些函数的返回值都是一些要生产的对象。就是这样而已。下面的代码都是这个套路。

1,工厂模式:知识点很多,很好。

目的:方便客户端的使用,比如这里是 让用户选择创建Dog或者Cat对象,并执行do_say()函数

from abc import ABCMeta,abstractmethod
'''
ABCMeta 这个东西是是为了生成抽象类的,这里测试了,没有他也可以,为保险起见还是加上吧!
@abstractmethod  被这个东西修饰的就是抽象函数
eval 的用法:在下面
设计继承类的好处就是统一规范,
'''
class Animal(metaclass=ABCMeta):
    @abstractmethod
    def do_say(self):
        pass

class Dog(Animal):
    def do_say(self):
        print("dog dog!!")

class Cat(Animal):
    def do_say(self):
        print("Cat,cat")

class ForestFactory(object):
    def make_sound(self,object_type):
        '''
        eval 的用法:参数是字符串,就是执行字符串所代表的程序。这里传入Dog

        return eval(object_type)().do_say()  就等同于
        return Dog().do_say()

        '''
        return eval(object_type)().do_say()
# 客户端代码:方便利索,这就是工厂模式的好处
if __name__ == '__main__':
    print(eval("1+3"))#输出 4
    ff = ForestFactory()
    animal = input("which naimal should make_sound Dog or Cat?")
    a = ff.make_sound(animal)
    pass



2,抽象工厂的另一种写法:

'''

'''
class Mercedes(object):
    """梅赛德斯
    """
    def __repr__(self):
        return "Mercedes-Benz"

class BMW(object):
    """宝马
    """
    def __repr__(self):
        return "BMW"

class SimpleCarFactory(object):
    """简单工厂
    """
    @staticmethod
    def product_car(name): 
        '''
            这种实现方法和第一种方法一样的道理,只不过,前面的用input手动输入而已
        '''
        if name == 'mb':
            return Mercedes()
        elif name == 'bmw':
            return BMW()
if __name__ == '__main__':
    c1 = SimpleCarFactory.product_car('mb')
    c2 = SimpleCarFactory.product_car('bmw')
    print(c1,c2)

上面的第二种代码:虽然有了一个简单的工厂,但在实际使用工厂的过程中,我们会发现新问题:如果我们要新增一个“产品”,例如Audi的汽车,我们除了新增一个Audi类外还要修改SimpleCarFactory内的product_car方法。这样就违背了软件设计中的开闭原则[1],即在扩展新的类时,尽量不要修改原有代码。所以我们在简单工厂的基础上把SimpleCarFactory抽象成不同的工厂,每个工厂对应生成自己的产品,这就是工厂方法。

解决方法

'''

'''

class Mercedes(object):
    """梅赛德斯
    """
    def __repr__(self):
        return "Mercedes-Benz"

class BMW(object):
    """宝马
    """
    def __repr__(self):
        return "BMW"

# ===================================
import abc

class AbstractFactory(object):
    """抽象工厂
    """
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def product_car(self):
        pass

class MercedesFactory(AbstractFactory):
    """梅赛德斯工厂
    """
    def product_car(self):
        return Mercedes()

class BMWFactory(AbstractFactory):
    """宝马工厂
    """
    def product_car(self):
        return BMW()
if __name__ == '__main__':
    c1 = MercedesFactory().product_car()
    c2 = BMWFactory().product_car()
    print(c1,c2)

上面代码还有缺点:

工厂方法虽然解决了我们“修改代码”的问题,但如果我们要生产很多产品,就会发现我们同样需要写很多对应的工厂类。比如如果MercedesFactoryBMWFactory不仅生产小汽车,还要生产SUV,那我们用工厂方法就要再多构造两个生产SUV的工厂类。所以为了解决这个问题,我们就要再更进一步的抽象工厂类,让一个工厂可以生产同一类的多个产品,这就是抽象工厂。具体实现如下:

import abc

# =================================两种小汽车==================================
class Mercedes_C63(object):
    """梅赛德斯 C63
    """
    def __repr__(self):
        return "Mercedes-Benz: C63"

class BMW_M3(object):
    """宝马 M3
    """
    def __repr__(self):
        return "BMW: M3"

# ===================================两种SUV=====================================
class Mercedes_G63(object):
    """梅赛德斯 G63
    """
    def __repr__(self):
        return "Mercedes-Benz: G63"

class BMW_X5(object):
    """宝马 X5
    """
    def __repr__(self):
        return "BMW: X5"

# ======================================抽象工厂
class AbstractFactory(object):
    """抽象工厂
    可以生产小汽车外,还可以生产SUV
    """
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def product_car(self):
        pass

    @abc.abstractmethod
    def product_suv(self):
        pass
#=====================================实现抽象工厂
class MercedesFactory(AbstractFactory):
    """梅赛德斯工厂
    """
    def product_car(self):
        return Mercedes_C63()

    def product_suv(self):
        return Mercedes_G63()

class BMWFactory(AbstractFactory):
    """宝马工厂
    """
    def product_car(self):
        return BMW_M3()

    def product_suv(self):
        return BMW_X5()

if __name__ == '__main__':
    c1 = MercedesFactory().product_car() # 梅赛德斯工厂 可以生产car
    s1 = MercedesFactory().product_suv() # 梅赛德斯工厂 可以生产SUV
    print(c1, s1)
    s2 = BMWFactory().product_suv() # 宝马同理
    c2 = BMWFactory().product_car()
    print(c2, s2)

高级实例-创建Facebook账号实例

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值