工厂模式的python实现
#1.什么是工厂模式 #2.工厂模式的分类
'''
1. 简单工厂模式
2. 工厂方法模式
3. 抽象工厂方法模式
''' #3.简单工厂模式的python实现
from abc import ABCMeta, abstractmethod
class Animal(metaclass=ABCMeta):
@abstractmethod
def do_say(self):
pass class Dog(Animal):
def do_say(self):
print("wang wang!!") class Cat(Animal):
def do_say(self):
print("miao miao!!") ## 定义工厂
class ForestFactory(object):
def make_sound(self, object_type):
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) #4.工厂方法模式的python实现
from abc import ABCMeta, abstractmethod
class Section(metaclass=ABCMeta):
@abstractmethod
def describe(self):
pass class PersonSection(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 Zhihu(Profile):
def createProfile(self):
self.addsections(PersonSection())
self.addsections(AlbumSection())
self.addsections(PublicationSection()) class Csdn(Profile):
def createProfile(self):
self.addsections(PatentSection())
self.addsections(PersonSection()) if __name__ == '__main__':
profile_type = input("which profile you'd like to create (Zhihu or Csdn)")
profile = eval(profile_type)()
print("create profile..", type(profile).__name__)
print("Profile has sections --", profile.getSections()) #5.抽象工厂模式的python实现
from abc import ABCMeta, abstractmethod 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 Ham on ", type(VegPizza).__name__) class 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) pizza = PizzaStore()
pizza.makePizzas() #6.工厂方法与抽象工厂方法的比较
# 工厂方法开发了一个创建对象的方法
# 抽象工厂方法开放了一个或者多个方法创建一个系列的相关对象
# 工厂方法使用继承和子类来决定要创建哪个对象
# 抽象共产方法使用组合将创建对象的任务委托给其他类
# 共产方法用于创建一个产品
# 抽象工厂方法用于创建相关产品的系列
#
#7.工厂模式的优缺点
'''
优点: 1.松耦合, 即对象的创建可以独立于类的实现
2.客户端无需了解创建对象的类的实现,但是依然可以创建对象
3.可以在工厂中添加其他类来创建其他类型的对象
4.工厂可以重用现有对象
'''
工厂模式的python实现的更多相关文章
- 设计模式之单例模式与工厂模式的Python实现(二)
2. 工厂模式 工厂模式是创建型设计模式的一种.核心的思想是,通过传递给类或函数某种产品的信息来创建产品并返回.当我们想得到产品a对象,只需把产品a的名字传递给工厂函数就能得到产品a对象.而核心思想的 ...
- 《大话设计模式》——简单工厂模式(Python版)
简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 例: 使用Python设计一个控制台计算器,要求输入两个数 ...
- 设计模式之单例模式与工厂模式的Python实现(一)
1. 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上 ...
- 工厂模式(python)
以字符串作为传递参数 以类名作为传递参数 来自为知笔记(Wiz)
- [python实现设计模式]-3.简单工厂模式-触宝开放平台
预备知识: 开放封闭原则(Open-Closed Principle OCP) Software entities(classes,modules,functions etc) should open ...
- 抽象工厂模式(python版)
http://blog.csdn.net/ponder008/article/details/6886039 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.优点:易 ...
- Python: 设计模式 之 工厂模式例(2)(神奇的Python)
#!/usr/bin/env python #coding=utf-8 # # 工厂模式第二例(神奇的Python) # 版权所有 2014 yao_yu (http://blog.csdn.net/ ...
- Python: 设计模式 之 工厂模式例(1)
#!/usr/bin/env python #coding=utf-8 # # 工厂模式一例 # 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126) ...
- python设计模式---创建型之工厂模式
# coding = utf-8 from abc import ABCMeta, abstractmethod # 简单工厂模式 class Animal(metaclass=ABCMeta): @ ...
随机推荐
- Eclipse集成Resinserver
因为Resin在Eclipse下的表现丝毫不亚于Tomcat,小编决定带领众小弟一起学习使用Resin.虽然小编身边也没有什么大牛在使用Resin,但看到Resin的广告已经吹到天边了.所以还 ...
- discuz新的单点论坛(不依赖UCenter)
discuz 本身提供UCENTER用户中心能够实现单点登录. 可是其它应用要单点登录到discuz还是存在若干问题: 须要2次激活.可能造成server无响应,论坛显示的最新注冊用户无法同步更新,官 ...
- 《解读window核心编程》 之 注冊表
1 注冊表的作用及组织形式 Windows系统使用注冊表来存储系统和应用程序配置数据.非常多系统和应用程序重要的配置的信息都存储在注冊表中. 注冊表是一种以树型结构组织的数据库.树的每个节点称 作键( ...
- 使用ALSA编写自己的音频程序【转】
本文转载自:http://blog.csdn.net/beyondioi/article/details/6994548 Alsa是Linux高级音频接口.面对众多的音频设备,Alsa为Linux音频 ...
- What is the difference between task and thread?
http://stackoverflow.com/questions/4130194/what-is-the-difference-between-task-and-thread 回答一: A tas ...
- 数据预处理之Minkowski距离计算
template <class T1, class T2> double Minkowski(const std::vector<T1> &inst1, const s ...
- Spark深入之RDD
目录 Part III. Low-Level APIs Resilient Distributed Datasets (RDDs) 1.介绍 2.RDD代码 3.KV RDD 4.RDD Join A ...
- bzoj2763: [JLOI2011]飞行路线(分层图spfa)
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3234 Solved: 1235[Submit][Stat ...
- ASP.NET MVC + 工厂模式 + 三层 + 缓存
最近将手头的项目总结整理了一下,以方便自己的学习.... 下面直接上图先介绍项目的结构图: 项目是ASP.NET MVC 4.0的应用程序,DBUtility这个类库主要是DbHelper操作数据库的 ...
- 【HTTP】长连接和短连接
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...