#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. java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

    1.错误描写叙述 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String service. ...

  2. axis实现webservices分布式通信

    分布式通信原理 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2ZsMjAxMjEzMTQ=/font/5a6L5L2T/fontsize/400/fil ...

  3. Python图像处理库PIL中图像格式转换(一)

    在数字图像处理中,针对不同的图像格式有其特定的处理算法. 所以,在做图像处理之前,我们须要考虑清楚自己要基于哪种格式的图像进行算法设计及事实上现.本文基于这个需求.使用python中的图像处理库PIL ...

  4. 试试pypy

    pypy是一个python的解释器和JIT编译器.能够在不改动不论什么代码的情况下大幅提升python代码的性能. 使用超级简单,在官网下载编译好的二进制包进行安装,然后然后执行代码的时候指定这个解释 ...

  5. cocos2d-x开发的《派对小游戏》-github源代码分享

    这是博主非常久曾经写的一个cocos2d-x跨平台小游戏,我称它为<派对小游戏>,如今分享给大家.希望对大家有所帮助的话. 项目源代码地址:https://github.com/xieba ...

  6. ningbooj--1655--木块拼接(贪心)

     [1655] 木块拼接 时间限制: 1000 ms 内存限制: 65535 K 问题描述 好奇的skyv95想要做一个正方形的木块,现在有三种颜色的矩形木块,颜色分别为"A" ...

  7. PCB MS SQL 将字符串分割为表变量(表值函数)

    Create FUNCTION [dbo].[SplitTable]( @s varchar(max), --待分拆的字符串 ) --数据分隔符 ),), col varchar(max)) --建立 ...

  8. Sorting It All Out(拓扑排序)

    http://poj.org/problem?id=1094 1.判断所给关系是否为合法的拓扑序列,若存在环,输出 "Inconsistency found after %d relatio ...

  9. Linux学习笔记--文件夹结构

    暂时先上一张图学习吧,先大致了解好,再进行深入的学习.

  10. .net MVC成长记录(四)Linq(1)

    今天不忙,没什么事情,继续写写随笔. 之前的文章写到了EF,很多人留言EF的操作用什么?  今天,就继续给大家分享EF的操作, Linq . 先从Linq操作Object内置对象开始 从Linq的基础 ...