1.什么是工厂设计模式
工厂--负责创建其他类型对象的类,工厂类有一个对象以及与它关联的多个方法。
客户端使用某些参数调用此方法,工厂会根据某些属性创建这些对象,并返回给客户端。
例如,客户去pizza店点pizza,这里的pizza店就是一个工厂,根据用户选择的属性创建一个完整的pizza,然后返回给客户。
它的设计意图:
- 松耦合,创建的对象可以独立于类实现
- 客户端无需知道创建对象的类,但是可以使用接口创建对象。简化了客户端的实现。
- 可以在工厂中添加其他类创建其他类型的对象,无需更改客户端代码
- 复用性
2.代码实现:
这里给出多种实现方式:
a.简单的工厂模式:
客户端选择猫或者狗,来获得一个猫或狗的叫声。
简单的工厂模式.JPG
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):
# eval(object_type)():<__main__.Cat object at 0x7fb8e7651518> 这是一个对象
# eval 用来执行一个字符串表达式,并返回表达式的值
return eval(object_type)().do_say()
# client code
if __name__ == '__main__':
ff = ForestFactory()
animal = input("Which animal should make_sound Dog or Cat?")
ff.make_sound(animal)
b.工厂方法模式:
工厂方法模式.JPG
# 基类
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.section = []
self.createProfile()
@abstractmethod
def createProfile(self):
pass
def getSection(self):
return self.section
def addSection(self, section):
self.section.append(section)
# linkedin软件创建,添加专利、发表物
class Linkedin(Profile):
def createProfile(self):
self.addSection(PersonalSection())
self.addSection(PatentSection())
self.addSection(PublicationSection())
# facebook软件创建,添加个人信息,相册
class facebook(Profile):
def createProfile(self):
self.addSection(PersonalSection())
self.addSection(AlbumSection())
if __name__ == "__main__":
profile_type = input("Which Profile you'd like create Facebook or LinkedIN")
profile = eval(profile_type.lower()) # 将输入变成小写
# print(eval(profile_type.lower())())
# p = facebook()
# print(p)
print("Create profile..", type(profile).__name__)
print("Profile has section --", profile().getSection())
c.抽象工厂方法实现单例:
抽象工厂方法.JPG
# 抽象基类--批萨工厂,包括两个抽象方法,制作蔬菜的和非蔬菜的.
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):
# 准备
pass
# 非蔬菜批萨的基类,蔬菜批萨+肉
class NonVegPizza(metaclass=ABCMeta):
@abstractmethod
def serve(self, VegPizza):
# 服务
pass
class DeluxVeggiePizza(VegPizza):
def prepare(self):
print("Perpare: ", 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("Perpare: ", 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):
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)
pizza = PizzaStore()
pizza.makePizzas()
4.源码:
https://github.com/Wind0ranger/LeetcodeLearn/blob/master/0-DesignPatterns/2-FactoryTon.py
网友评论