python重温设计模式===>创建型

前面c++粗略学习过一次,忘记了,现在回想回想。

Github:https://github.com/faif/python-patterns

simple_factory.py

#!/usr/bin/env python
# encoding: utf-8
"""
简单工厂模式

增加操作:
    1. 增加对应子类
    2. 修改工厂类
"""


class Operation(object):

    @property
    def number_a(self):
        return self.__number_a

    @number_a.setter
    def number_a(self, value):
        self.__number_a = value

    @property
    def number_b(self):
        return self.__number_b

    @number_b.setter
    def number_b(self, value):
        self.__number_b = value


class OperationAdd(Operation):
    def get_result(self):
        return self.number_a + self.number_b


class OperationSub(Operation):
    def get_result(self):
        return self.number_a - self.number_b


class OperationFactory(object):
    @staticmethod
    def create_operation(operate):
        if operate == "+":
            return OperationAdd()
        elif operate == "-":
            return OperationSub()

if __name__ == '__main__':
    op = OperationFactory.create_operation('+')
    op.number_a = 10
    op.number_b = 5

    print op.get_result()
abstract_factory.py
#!/usr/bin/env python
# encoding: utf-8
"""
抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口, 而无需指定他们具体的类
- 优点: 易于交换产品, 具体工厂配置不同的产品
- 优点: 让具体的创建实例过程与客户端分离, 客户端是通过它们的抽象接口操纵实例, 产品的具体类名也被具体工厂的实现分离, 不会出现在客户端的代码中
"""

from abc import ABCMeta, abstractmethod


class AbstractProductA(object):
    """
    抽象产品, 可能拥有多种实现
    """
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return "ProductA: %s" % self.name


class ConcreteProductA1(AbstractProductA):
    pass


class ConcreteProductA2(AbstractProductA):
    pass


class AbstractProductB(object):
    """
    抽象产品, 可能拥有多种实现
    """
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return "ProductB: %s" % self.name


class ConcreteProductB1(AbstractProductB):
    pass


class ConcreteProductB2(AbstractProductB):
    pass


class AbstractFactory(object):
    """
    抽象工厂接口, 包含所有产品创建的抽象方法
    """
    __metaclass__ = ABCMeta

    @abstractmethod
    def create_product_a(self):
        pass

    @abstractmethod
    def create_product_b(self):
        pass


class ConcreteFactory1(AbstractFactory):
    """
    具体工厂, 创建具有特定实现的产品对象
    """

    def create_product_a(self):
        return ConcreteProductA1("PA1")

    def create_product_b(self):
        return ConcreteProductB1("PB1")


class ConcreteFactory2(AbstractFactory):
    def create_product_a(self):
        return ConcreteProductA2("PA2")

    def create_product_b(self):
        return ConcreteProductB2("PB2")


if __name__ == '__main__':
    factory = ConcreteFactory2()

    product_a = factory.create_product_a()
    print product_a
builder.py
#!/usr/bin/env python
# encoding: utf-8
"""
建造者模式
将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示
- 用户只需指定需要建造的类型, 不需要知道具体地建造过程和细节
- 建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时适用的模式
"""

from abc import ABCMeta, abstractmethod


class Product(object):
    """
    具体产品
    """

    def __init__(self):
        self.__parts = []

    def add(self, part):
        self.__parts.append(part)

    def show(self):
        print '-'.join(self.__parts)


class Builder(object):
    """
    为创建一个product对象的各个部件指定的抽象接口
    """

    __metaclass__ = ABCMeta

    @abstractmethod
    def build_part_1(self):
        pass

    @abstractmethod
    def build_part_2(self):
        pass

    @abstractmethod
    def get_result(self):
        pass


class BuilderA(Builder):
    def __init__(self):
        self.__product = Product()

    def build_part_1(self):
        self.__product.add("partA1")

    def build_part_2(self):
        self.__product.add("partA2")

    def get_result(self):
        return self.__product


class BuilderB(Builder):
    def __init__(self):
        self.__product = Product()

    def build_part_1(self):
        self.__product.add("partB1")

    def build_part_2(self):
        self.__product.add("partB2")

    def get_result(self):
        return self.__product


class Director(object):
    @staticmethod
    def construct(builder):
        builder.build_part_1()
        builder.build_part_2()


if __name__ == '__main__':
    ba = BuilderA()
    bb = BuilderB()

    Director.construct(ba)
    product = ba.get_result()
    product.show()

    Director.construct(bb)
    product = bb.get_result()
    product.show()
factory_method.py
#!/usr/bin/env python
# encoding: utf-8
"""
工厂方法
定义一个用于创建对象的接口, 让子类决定实例化哪个类
工厂方法使一个类的实例化延迟到其子类
如果存在变更, 改creator即可
"""

from abc import ABCMeta, abstractmethod


class Product(object):
    """
    定义工厂方法所创建的对象接口
    """
    __metaclass__ = ABCMeta

    @abstractmethod
    def echo(self):
        pass


class ConcreteProductA(Product):
    """
    具体的产品, 实现了product的接口
    """

    def echo(self):
        print "product A"


class ConcreteProductB(Product):
    """
    具体的产品, 实现了product的接口
    """

    def echo(self):
        print "product B"


class Creator(object):
    """
    声明了工厂方法, 该方法返回一个Product类型的对象
    """
    __metaclass__ = ABCMeta

    @abstractmethod
    def create(self):
        pass


class ConcreteCreatorA(Creator):
    """
    重定义, 返回一个ConcreteProduct实例
    """

    def create(self):
        return ConcreteProductA()


class ConcreteCreatorB(Creator):
    def create(self):
        return ConcreteProductB()


if __name__ == '__main__':
    factory_a = ConcreteCreatorA()
    product = factory_a.create()
    product.echo()

    factory_b = ConcreteCreatorB()
    product = factory_b.create()
    product.echo()
prototype.py
#!/usr/bin/env python
# encoding: utf-8
"""
原型模式
用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象
- 原型模型其实是从一个对象再创建另外一个可定制的对象, 而且不需要知道任何创建细节
- 一般在初始化信息不发生变化的情况下, 克隆是最好的办法, 既隐藏了对象创建的细节, 有提高了性能
"""
import copy
from abc import ABCMeta, abstractmethod


class Prototype(object):
    """
    原型类, 声明一个克隆自身的接口
    """
    __metaclass__ = ABCMeta

    def __init__(self, id):
        self.__id = id

    @property
    def id(self):
        return self.__id

    @id.setter
    def id(self, value):
        self.__id = value

    @abstractmethod
    def clone(self):
        pass


class ConcretePrototypeA(Prototype):
    """
    具体原型类, 实现一个克隆自身的操作
    """
    def clone(self):
        # 浅拷贝
        return copy.copy(self)


class ConcretePrototypeB(Prototype):
    """
    具体原型类, 实现一个克隆自身的操作
    """
    def clone(self):
        return copy.copy(self)


if __name__ == '__main__':
    ca = ConcretePrototypeA(1)
    c2 = ca.clone()
    print c2.id
singleton.py
#!/usr/bin/env python
# encoding: utf-8
"""
单例模式
保证一个类仅有一个实例, 并提供一个访问他的全局访问点
TODO: 如果是多线程, 要考虑加锁
"""


class Singleton(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **
                                                                 kwargs)
        return cls._instances[cls]


#Python2
class MyClass(object):
    __metaclass__ = Singleton

if __name__ == '__main__':
    a = MyClass()
    b = MyClass()
    print a == b
    print a is b


你可能感兴趣的:(C++设计模式,Python)