又要来胡吹了, 工厂模式就是在一个类(工厂)中创造各种需要的类, 然后根据需要的子类创建对应的实例。抽象工厂模式并没有理解,日后且用且理解且更新
文章目录
- 工厂模式的概念、优缺点
- 工厂模式分类及python实现
- 工厂模式需要注意的问题
工厂模式的概念、优缺点
工厂模式简单理解的话, 就是创建一个类(称为工厂), 然后在工厂中创建所需的子类的实例。
工厂模式分类及python实现
- 简单工厂模式
- 工厂方法模式
- 抽象工厂模式
简单工厂模式
定义:定义一个工厂类,工厂类根据传入的参数常见对应的子类并返回。这种设计方法称为简单工厂模式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
30from abc import ABCMeta, abstractmethod
'''
简单工厂模式
'''
# 实体类的基类
class Animal(metaclass=ABCMeta):
def do_say(self):
pass
class Dog(Animal):
def do_say(self):
print("Bhow Bhow")
class Cat(Animal):
def do_say(self):
print("Meow Meow")
# 简单工厂类
class ForestFactory(object):
def make_sound(self, object_type):
return eval(object_type)().do_say()
if __name__ == "__main__":
animal = ForestFactory()
animal.make_sound("Dog")
animal.make_sound("Cat")
工厂方法模式
定义:定义一个工厂类, 工厂类中创建一个抽象方法用来创建所需的类的实例, 然后在子类中继承工厂类实现抽象方法来创建所需的类。这种设计方法称为工厂方法模式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'''
工厂方法模式
- 优点:灵活、松耦合、
- 目的:将创建实例的任务委托给子类
'''
# 工厂方法模式 实体类的基类
class Section(metaclass=ABCMeta):
def describe(self):
pass
class PersonalSection(Section):
def describe(self):
print("Personal Section")
class AlbumSection(Section):
def describe(self):
print("Album section")
class PatentSection(Section):
def describe(self):
print("Patent Section")
class PublicationSection(Section):
def describe(self):
print("Publication Section")
# 工厂方法模式 工厂方法类
class Profile(metaclass=ABCMeta):
def __init__(self):
self.sections = []
self.createProfile()
# 抽象接口, 用来创建需要的类
def createProfile(self):
pass
def getSections(self):
return self.sections
def addSections(self, section):
self.sections.append(section)
# 工厂方法模式 具体实现类
class linkedin(Profile):
def createProfile(self):
self.addSections(PersonalSection())
self.addSections(PatentSection())
self.addSections(PublicationSection())
# 工厂方法模式 具体实现类
class facebook(Profile):
def createProfile(self):
self.addSections(PersonalSection())
self.addSections(AlbumSection())
if __name__ == "__main__":
profile_type = input("which profile you'd like to create? [Linkedin or FaceBook]")
profile = eval(profile_type.lower())()
print("Creating Profile..", type(profile).__name__)
print("Profile has sections --", profile.getSections())
抽象工厂模式
定义:定义一个工厂类, 在工厂类中通过一个接口创建一系列的对象。这种设计方法称为抽象工厂模式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'''
抽象工厂模式
- 优点
- 目的:创建一系列相关的对象
'''
class PizzaFactory(metaclass=ABCMeta):
def createVegPizza(self):
pass
def createNonVegPizza(self):
pass
# 抽象工厂的实体类
class IndianPizzaFactory(PizzaFactory):
def createVegPizza(self):
return DeluxVeggiePizza()
def createNonVegPizza(self):
return ChickenPizza()
# 抽象工厂的实体类
class USPizzaFactory(PizzaFactory):
def createVegPizza(self):
return MexicanVegPizza()
def createNonVegPizza(self):
return HamPizza()
class VegPizza(metaclass=ABCMeta):
def prepare(self, VegPizza):
pass
class NonVegPizza(metaclass=ABCMeta):
def serve(self, VegPizza):
pass
class DeluxVeggiePizza(VegPizza):
def prepare(self):
print("Prepare ", type(self).__name__)
class ChickenPizza(NonVegPizza):
def serve(self, VegPizza):
print(type(self).__name__, " is served with Chicken on ", type(VegPizza).__name__)
class MexicanVegPizza(VegPizza):
def prepare(self):
print("Prepare ", type(self).__name__)
class HamPizza(NonVegPizza):
def serve(self, VegPizza):
print(type(self).__name__, " is served with Chicken on ", type(VegPizza).__name__)
# 抽象工厂模式 工厂接口
class PizzaStore(object):
"""docstring for PizzaStore"""
def __init__(self):
pass
# 工厂接口 用来创建各种对象
def makePizzas(self):
for factory in [IndianPizzaFactory(), USPizzaFactory()]:
self.factory = factory
self.NonVegPizza = self.factory.createNonVegPizza()
self.VegPizza = self.factory.createVegPizza()
self.VegPizza.prepare()
self.NonVegPizza.serve(self.VegPizza)