python设计模式创建型

  1. Factory Method(工厂方法)
  2. Abstract Factory(抽象工厂)
  3. Builder(建造者)
  4. Prototype(原型)
  5. Singleton(单例)

Factory Method(工厂方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# coding:utf8
class :
def __init__(self):
self.name = None
self.gender = None

def getName(self):
return self.name

def getGender(self):
return self.gender


class Male(Person):
def __init__(self, name):
self.name = name

class Female(Person):
def __init__(self, name):
self.name = name


class Factory:
def getPerson(self, name, gender):
if gender == 'M':
return Male(name)
if gender == 'F':
return Female(name)


if __name__ == '__main__':
factory = Factory()
person = factory.getPerson("Chetan", "M")
print(person.getName())

Abstract Factory(抽象工厂)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# http://ginstrom.com/scribbles/2007/10/08/design-patterns-python-style/

"""Implementation of the abstract factory pattern"""

import random


class PetShop:
"""A pet shop"""

def __init__(self, animal_factory=None):
"""pet_factory is our abstract factory. We can set it at will."""
self.pet_factory = animal_factory

def show_pet(self):
"""Creates and shows a pet using the abstract factory"""
pet = self.pet_factory.get_pet()
print("We have a lovely {}".format(pet))
print("It says {}".format(pet.speak()))
print("We also have {}".format(self.pet_factory.get_food()))


# Stuff that our factory makes

class Dog:
def speak(self):
return "woof"

def __str__(self):
return "Dog"


class Cat:
def speak(self):
return "meow"

def __str__(self):
return "Cat"


# Factory classes

class DogFactory:

def get_pet(self):
return Dog()

def get_food(self):
return "dog food"


class CatFactory:

def get_pet(self):
return Cat()

def get_food(self):
return "cat food"


# Create the proper family
def get_factory():
"""Let's be dynamic!"""
return random.choice([DogFactory, CatFactory])()


# Show pets with various factories

for i in range(3):
shop = PetShop(get_factory())
shop.show_pet()
print("=" * 20)

Builder(建造者)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

# coding:utf8

"""
Builder
"""


# Director
class Director(object):
def __init__(self):
self.builder = None

def construct_building(self):
self.builder.new_building()
self.builder.build_floor()
self.builder.build_size()

def get_building(self):
return self.builder.building


# Abstract Builder
class Builder(object):
def __init__(self):
self.building = None

def new_building(self):
self.building = Building()


# Concrete Builder
class BuilderHouse(Builder):
def build_floor(self):
self.building.floor = 'One'

def build_size(self):
self.building.size = 'Big'


class BuilderFlat(Builder):
def build_floor(self):
self.building.floor = 'More than One'

def build_size(self):
self.building.size = 'Small'


# Product
class Building(object):
def __init__(self):
self.floor = None
self.size = None

def __repr__(self):
return 'Floor: %s | Size: %s' % (self.floor, self.size)


# Client
if __name__ == "__main__":
director = Director()
director.builder = BuilderHouse()
director.construct_building()
building = director.get_building()
print(building)
director.builder = BuilderFlat()
director.construct_building()
building = director.get_building()
print(building)

Prototype(原型)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

# coding:utf8
'''
Prototype
'''

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()

单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import threading


class Singleton(object):
_instance_lock = threading.Lock()

def __init__(self):
pass

def __new__(cls, *args, **kwargs):
if not hasattr(Singleton, "_instance"):
with Singleton._instance_lock:
if not hasattr(Singleton, "_instance"):
Singleton._instance = object.__new__(cls)
return Singleton._instance


obj1 = Singleton()
obj2 = Singleton()
print(obj1, obj2)


def task(arg):
obj = Singleton()
print(obj)


for i in range(10):
t = threading.Thread(target=task, args=[i, ])
t.start()