抽象工厂模式:

提供一个接口,用户创建多个相关或依赖对象,而不需要指定具体类。

原则:

依赖抽象,不依赖具体类。

实例:

用不同原材料制作不同口味的披萨,创建不同原材料的工厂,不同实体店做出口味不同的披萨。创建一个产品家族(Dough、Sauce、Cheese和Clam)的抽象类型(PizzaIngredientFactory),这个类型的子类(NYPizzaIngredientFactory和ChicagoPizzaIngredientFactory)定义了产品被产生的方法。

工厂模式和抽象工厂模式的区别:

工厂模式是在派生类中定义一个工厂的抽象接口,然后基类负责创建具体对象;抽象工厂模式是维护一个产品家族,由基类定义产品被生产的方法,客户根据派生类的接口进行开发。

代码:

#!/usr/bin/python
# -*- coding:utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8') '''
披萨
'''
class Pizza:
name = ""
dough = None
sauce = None
cheese = None
clam = None def prepare(self):
pass def bake(self):
print "烘烤25分钟在350。".decode('utf-8') def cut(self):
print "切割成对角线切片。".decode('utf-8') def box(self):
print "放在官方的盒子中。".decode('utf-8') def get_name(self):
return self.name def set_name(self, name):
self.name = name def to_string(self):
string = "%s:\n" % self.name
string += " 面团: %s\n" % self.dough.to_string() if self.dough else ""
string += " 酱汁: %s\n" % self.sauce.to_string() if self.sauce else ""
string += " 奶酪: %s\n" % self.cheese.to_string() if self.cheese else ""
string += " 文蛤: %s\n" % self.clam.to_string() if self.clam else ""
return string '''
什么类别的披萨
'''
class CheesePizza(Pizza):
def __init__(self, ingredient_factory):
self.ingredient_factory = ingredient_factory def prepare(self):
print "准备: %s" % self.name
self.dough = self.ingredient_factory.create_dough()
self.sauce = self.ingredient_factory.create_sauce()
self.cheese = self.ingredient_factory.create_cheese() class ClamPizza(Pizza):
def __init__(self, ingredient_factory):
self.ingredient_factory = ingredient_factory def prepare(self):
print "准备: %s" % self.name
self.dough = self.ingredient_factory.create_dough()
self.sauce = self.ingredient_factory.create_sauce()
self.clam = self.ingredient_factory.create_clam() '''
披萨店
'''
class PizzaStore:
def order_pizza(self, pizza_type):
self.pizza = self.create_pizza(pizza_type)
self.pizza.prepare()
self.pizza.bake()
self.pizza.cut()
self.pizza.box()
return self.pizza def create_pizza(self, pizza_type):
pass '''
纽约披萨实体店1
'''
class NYPizzaStore(PizzaStore):
def create_pizza(self, pizza_type):
ingredient_factory = NYPizzaIngredientFactory() if pizza_type == "cheese":
pizza = CheesePizza(ingredient_factory)
pizza.set_name("纽约风格芝士披萨".decode('utf-8'))
elif pizza_type == "clam":
pizza = ClamPizza(ingredient_factory)
pizza.set_name("纽约风格文蛤披萨".decode('utf-8'))
else:
pizza = None return pizza '''
芝加哥披萨实体店2
'''
class ChicagoPizzaStore(PizzaStore):
def create_pizza(self, pizza_type):
ingredient_factory = ChicagoPizzaIngredientFactory() if pizza_type == "cheese":
pizza = CheesePizza(ingredient_factory)
pizza.set_name("芝加哥风格芝士披萨".decode('utf-8'))
elif pizza_type == "clam":
pizza = ClamPizza(ingredient_factory)
pizza.set_name("芝加哥风格文蛤披萨".decode('utf-8'))
else:
pizza = None return pizza '''
生产披萨的工厂
'''
class PizzaIngredientFactory:
def create_dough(self):
pass def create_sauce(self):
pass def create_cheese(self):
pass def create_clam(self):
pass '''
生产披萨的实体工厂1
'''
class NYPizzaIngredientFactory(PizzaIngredientFactory):
def create_dough(self):
return ThinDough() def create_sauce(self):
return MarinaraSauce() def create_cheese(self):
return FreshCheese() def create_clam(self):
return FreshClam() '''
生产披萨的实体工厂2
'''
class ChicagoPizzaIngredientFactory(PizzaIngredientFactory):
def create_dough(self):
return ThickDough() def create_sauce(self):
return MushroomSauce() def create_cheese(self):
return BlueCheese() def create_clam(self):
return FrozenClam() class Dough:
def to_string(self):
pass class ThinDough(Dough):
def to_string(self):
return "薄的面团" class ThickDough(Dough):
def to_string(self):
return "厚的生面团" class Sauce:
def to_string(self):
pass class MarinaraSauce(Sauce):
def to_string(self):
return "番茄酱" class MushroomSauce(Sauce):
def to_string(self):
return "蘑菇酱" class Cheese:
def to_string(self):
pass class FreshCheese(Cheese):
def to_string(self):
return "新鲜的奶酪" class BlueCheese(Cheese):
def to_string(self):
return "蓝纹奶酪" class Clam:
def to_string(self):
pass class FreshClam(Clam):
def to_string(self):
return "新鲜的文蛤" class FrozenClam(Clam):
def to_string(self):
return "冷冻的文蛤" if __name__ == "__main__":
# 创建了两个披萨实体店
ny_store = NYPizzaStore()
chicago_store = ChicagoPizzaStore() # 在第一个披萨对象中订购了一个cheese风味的披萨
pizza = ny_store.order_pizza("cheese")
print pizza.to_string()
print "迈克订购了一个 %s" % pizza.get_name()
print pizza = chicago_store.order_pizza("clam")
print pizza.to_string()
print "约翰订购了一个%s" % pizza.get_name()
print

结果:

准备: 纽约风格芝士披萨
烘烤25分钟在350。
切割成对角线切片。
放在官方的盒子中。
纽约风格芝士披萨:
面团: 薄的面团
酱汁: 番茄酱
奶酪: 新鲜的奶酪 迈克订购了一个 纽约风格芝士披萨 准备: 芝加哥风格文蛤披萨
烘烤25分钟在350。
切割成对角线切片。
放在官方的盒子中。
芝加哥风格文蛤披萨:
面团: 厚的生面团
酱汁: 蘑菇酱
文蛤: 冷冻的文蛤 约翰订购了一个芝加哥风格文蛤披萨

python风格的抽象工厂模式的更多相关文章

  1. Python—程序设计:抽象工厂模式

    抽象工厂模式 内容:定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象. 例:生产一部手机,需要手机壳.CPU.操作系统三类对象进行组装,其中每类对象都有不同的种类.对每个具体工厂,分别生 ...

  2. [Python编程实战] 第一章 python的创建型设计模式1.1抽象工厂模式

    注:关乎对象的创建方式的设计模式就是“创建型设计模式”(creational design pattern) 1.1 抽象工厂模式 “抽象工厂模式”(Abstract Factory Pattern) ...

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

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

  4. 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...

  5. 大话设计模式Python实现- 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的类 下面是一个抽象工厂的demo: #!/usr/bin/env pyth ...

  6. 浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  7. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  8. [Python设计模式] 第15章 如何兼容各种DB——抽象工厂模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目 如何让一个程序,可以灵活替换数据库? 基础版本 class User(): ...

  9. 设计模式 -创建型模式 ,python工厂模式 抽象工厂模式(1)

    工厂模式 import xml.etree.ElementTree as etree import json class JSONConnector: def __init__(self, filep ...

随机推荐

  1. Python3练习题系列(09)——物以类聚,人以群分

    目标: 用类管理同类事物 解析: 用到“class”的编程语言被称作“Object Oriented Programming(面向对象编程)”语言.首先你需要做出“东西”来,然后你“告诉”这些东西去完 ...

  2. c潭州课堂25班:Ph201805201 MySQL第二课 (课堂笔记)

    mysql> create table tb_2( -> id int, -> name varchar(10) not null -> ); 插入数据 insert into ...

  3. 用一颗学美术的心来理解PID调节

    用一颗学美术的心来理解PID调节 泡利 3 个月前 相信大家小时候都画过美术作品吧?(什么?你还是宝宝?)没关系,不管你是文科.理科.工科.艺术还是家里蹲的,这篇文章对你来说一定会简单到爆炸的. 这种 ...

  4. git的安装以及入门

    安装:https://blog.csdn.net/itpinpai/article/details/48105445 (1)下载文件 初始化 git init 连远程服务器 git remote ad ...

  5. linux sendmail 发送缓慢的问题

    这个问题关键就是hosts里面对于本机host的设置有问题,你可以看下/var/log/mail.log retry 和 sleeping,再加上其他时间,用sendmail发送邮件等这么久,太累了吧 ...

  6. spyder 安装

    https://www.cnblogs.com/pcat/p/5398997.html

  7. Date与Quartz的cron之间的相互转换

    1.概述 最近在写一个Quartz相关的模块,需要实现Date与Quartz的cron之间的相互转换,在网上查了一下竟然没有找到,但是找到一份这样的博客:http://hw1287789687.ite ...

  8. 如何诊断windows性能问题

    直接使用perfmon中的性能诊断工具

  9. docker-compose中启动镜像失败的问题

    http://blog.csdn.net/boling_cavalry/article/details/79050451 解决docker-compose启动镜像失败的问题: 原文地址:http:// ...

  10. 数据库连接池优化配置(druid,dbcp,c3p0)

    主要描述了数据库连接池参数配置的准则,针对常用的数据库连接池(c3p0,dbcp,druid)给出推荐的配置. 考虑因素 1:当前连接DB的规模   2:并发情况 3:执行db的响应时间 配置考虑 1 ...