设计模式:工厂模式

又要来胡吹了, 工厂模式就是在一个类(工厂)中创造各种需要的类, 然后根据需要的子类创建对应的实例。抽象工厂模式并没有理解,日后且用且理解且更新

文章目录

  • 工厂模式的概念、优缺点
  • 工厂模式分类及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
30
from abc import ABCMeta, abstractmethod

'''
简单工厂模式
'''

# 实体类的基类
class Animal(metaclass=ABCMeta):
@abstractmethod
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):
@abstractmethod
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()

# 抽象接口, 用来创建需要的类
@abstractmethod
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):
@abstractmethod
def createVegPizza(self):
pass

@abstractmethod
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):
@abstractmethod
def prepare(self, VegPizza):
pass

class NonVegPizza(metaclass=ABCMeta):
@abstractmethod
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)

工厂模式需要注意的问题

owefsad wechat
进击的DevSecOps,持续分享SAST/IAST/RASP的技术原理及甲方落地实践。如果你对 SAST、IAST、RASP方向感兴趣,可以扫描下方二维码关注公众号,获得更及时的内容推送。
0%