常用的設計模式

一、建造者

需求:

畫人物,需要畫一個人的左手,右手,左腳,右腳,身體,頭部

畫一個瘦子、畫一個胖子

 

from abc import ABCMeta,abstractmethod

class Builder():

    __metaclass__=ABCMeta

 

    @abstractmethod

    def draw_left_arm(self):

        pass

    

    @abstractmethod

    def draw_right_arm(self):

        pass

   

    @abstractmethod

    def draw_left_foot(self):

        pass

    

    @abstractmethod

    def draw_right_foot(self):

        pass

 

    @abstractmethod

    def draw_body(self):

        pass

 

    @abstractmethod

    def draw_head(self):

        pass

 

class Thin(Builder):

 

    def draw_left_arm(self):

        print("畫左手")

    

    def draw_right_arm(self):

        print("畫右手")

   

 

    def draw_left_foot(self):

        print("畫左腳")

    

    def draw_right_foot(self):

        print("畫右腳")

 

    def draw_body(self):

        print("畫瘦身體")

 

    def draw_head(self):

        print("畫頭部")

 

class Fat(Builder):

 

    def draw_left_arm(self):

        print("畫左手")

    

    def draw_right_arm(self):

        print("畫右手")

   

 

    def draw_left_foot(self):

        print("畫左腳")

    

    def draw_right_foot(self):

        print("畫右腳")

 

    def draw_body(self):

        print("畫胖身體")

 

    def draw_head(self):

        print("畫頭部")

 

class Director():

    def __init__(self,person):

        self.person=person

    def draw(self):

        self.person.draw_left_arm()

        self.person.draw_right_arm()

        self.person.draw_left_foot()

        self.person.draw_right_foot()

        self.person.draw_body()

        self.person.draw_head()

 

if __name__=="__main__":

    thin=Thin()

    fat=Fat()

    director_thin=Director(thin)

    director_thin.draw()

    director_fat=Director(fat)

    director_fat.draw()

 

 

二、原型

 

對一個基類對象進行克隆複製,創造出與模型一樣的副本去操作。

 

 

import copy

 

class Prototype:

    def __init__(self):

        self.__objects={}

    

    def register_object(self,name,obj):

        """Register an object"""

        self.__objects[name]=obj

 

    def unregister_object(self,name):

        """Unregister an object"""

        del self.__objects[name]

   

    def clone(self,name,**attr):

        """Clone a registered object and update inner attributes dictionary"""

        obj=copy.deepcopy(self.__objects.get(name))

        obj.__dict__.update(attr)

        return obj

 

def main():

    class A:

        def __str__(self):

            return "I am A"

     

    a=A()

    prototype=Prototype()

    prototype.register_object("a",a)

    b=prototype.clone('a',a=1,b=2,c=3)

    print(a)

    print(b.a,b.b,b.c)

 

if __name__=="__main__":

    main()

 

 

三、單例

 

保證一個類僅有一個實例,並且提供訪問它的全局節點

 

class Singleton(object):

    def __new__(cls):

        #每一次實例化的時候,我們都只會返回着同一個instance對象

        if not hasattr(cls,'_instance'):

            cls._instance=super(Singleton,cls).__new__(cls)

        return cls._instance

 

obj1=Singleton()

obj2=Singleton()

obj1.attr1="value1"

print(obj1.attr1,obj2.attr1)

print(obj1 is obj2)

 

四、適配器

將類的一個接口轉換爲客戶希望的另一個接口

import os

  

class Dog(object):

    def __init__(self):

        self.name = "Dog"

 

    def bark(self):

        return "woof!"

 

 

class Cat(object):

    def __init__(self):

        self.name = "Cat"

 

    def meow(self):

        return "meow!"

 

 

class Human(object):

    def __init__(self):

        self.name = "Human"

 

    def speak(self):

        return "'hello'"

 

 

class Car(object):

    def __init__(self):

        self.name = "Car"

 

    def make_noise(self, octane_level):

        return "vroom%s" % ("!" * octane_level)

 

 

class Adapter(object):

    """

    Adapts an object by replacing methods.

    Usage:

    dog = Dog

    dog = Adapter(dog, dict(make_noise=dog.bark))

    """

    def __init__(self, obj, adapted_methods):

        """We set the adapted methods in the object's dict"""

        self.obj = obj

        self.__dict__.update(adapted_methods)

 

    def __getattr__(self, attr):

        """All non-adapted calls are passed to the object"""

        return getattr(self.obj, attr)

 

 

def main():

    objects = []

    dog = Dog()

    objects.append(Adapter(dog, dict(make_noise=dog.bark)))

    cat = Cat()

    objects.append(Adapter(cat, dict(make_noise=cat.meow)))

    human = Human()

    objects.append(Adapter(human, dict(make_noise=human.speak)))

    car = Car()

    car_noise = lambda: car.make_noise(3)

    objects.append(Adapter(car, dict(make_noise=car_noise)))

 

    for obj in objects:

        print ("A", obj.name, "goes", obj.make_noise())

 

 

if __name__ == "__main__":

    main()

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章