#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实现的更多相关文章

  1. 设计模式之单例模式与工厂模式的Python实现(二)

    2. 工厂模式 工厂模式是创建型设计模式的一种.核心的思想是,通过传递给类或函数某种产品的信息来创建产品并返回.当我们想得到产品a对象,只需把产品a的名字传递给工厂函数就能得到产品a对象.而核心思想的 ...

  2. 《大话设计模式》——简单工厂模式(Python版)

    简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 例: 使用Python设计一个控制台计算器,要求输入两个数 ...

  3. 设计模式之单例模式与工厂模式的Python实现(一)

    1. 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上 ...

  4. 工厂模式(python)

    以字符串作为传递参数 以类名作为传递参数 来自为知笔记(Wiz)

  5. [python实现设计模式]-3.简单工厂模式-触宝开放平台

    预备知识: 开放封闭原则(Open-Closed Principle OCP) Software entities(classes,modules,functions etc) should open ...

  6. 抽象工厂模式(python版)

    http://blog.csdn.net/ponder008/article/details/6886039 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.优点:易 ...

  7. Python: 设计模式 之 工厂模式例(2)(神奇的Python)

    #!/usr/bin/env python #coding=utf-8 # # 工厂模式第二例(神奇的Python) # 版权所有 2014 yao_yu (http://blog.csdn.net/ ...

  8. Python: 设计模式 之 工厂模式例(1)

    #!/usr/bin/env python #coding=utf-8 # # 工厂模式一例 # 版权所有 2014 yao_yu (http://blog.csdn.net/yao_yu_126) ...

  9. python设计模式---创建型之工厂模式

    # coding = utf-8 from abc import ABCMeta, abstractmethod # 简单工厂模式 class Animal(metaclass=ABCMeta): @ ...

随机推荐

  1. LeetCode之LCP(Longest Common Prefix)问题

    这个也是简单题目.可是关键在于题意的理解. 题目原文就一句话:Write a function to find the longest common prefix string amongst an ...

  2. 分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机

    微软官方有一套专门用于SharePoint 2010, Exchange 2010 Demo的虚拟机:SharePoint 2010: Information Worker Demonstration ...

  3. oc37--类工厂方法

    // // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int ag ...

  4. C# SuperWebSocket服务端学习(二)

    首先需要下载DLL类库  地址详见:http://download.csdn.NET/detail/u011269801/9590935 1,打开VS2012,新建一个控制台应用程序,选择.NET4. ...

  5. CentOs7 修改rpm安装背景图

    http://bbs.chinaunix.net/thread-4166176-1-1.html

  6. Python中的math和保留小数位数方法

    转载自 http://xukaizijian.blog.163.com/blog/static/17043311920111163272414/ math模块实现了许多对浮点数的数学运算函数.  这些 ...

  7. Genuitec

  8. php循环跳出

    PHP中的循环结构大致有for循环,while循环,do{} while 循环以及foreach循环几种,不管哪种循环中,在PHP中跳出循环大致有这么几种方式: 代码: <?php $i = 1 ...

  9. Eclipse项目包上出现红叉如何去除

    Eclipse项目包上出现红叉是因为jdk的版本不一致. 项目名--->Properties----->Java Compiler 图1:

  10. 想要学好C/C++,我到底要看多少书才能成为一个合格的C/C++工程师?

    如何学好C语言 这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子.比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便 ...