python风格的抽象工厂模式

抽象工厂模式:

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

原则:

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

实例:

用不同原材料制作不同口味的披萨,创建不同原材料的工厂,不同实体店做出口味不同的披萨。创建一个产品家族(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。
切割成对角线切片。
放在官方的盒子中。
芝加哥风格文蛤披萨:
    面团: 厚的生面团
    酱汁: 蘑菇酱
    文蛤: 冷冻的文蛤

约翰订购了一个芝加哥风格文蛤披萨
时间: 2024-12-28 21:10:50

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

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

抽象工厂模式 内容:定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象. 例:生产一部手机,需要手机壳.CPU.操作系统三类对象进行组装,其中每类对象都有不同的种类.对每个具体工厂,分别生产一部手机所需要的三个对象. 相比工厂方法模式,抽象工厂模式中的每个具体工厂都生产一套产品. 角色: 抽象工厂角色(Creator) 具体工厂角色(Concrete Creator) 抽象产品角色(Product) 具体产品角色(Concrete Product) 客户端(Client) 优点: 将

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

注:关乎对象的创建方式的设计模式就是"创建型设计模式"(creational design pattern) 1.1 抽象工厂模式 "抽象工厂模式"(Abstract Factory Pattern)用来创建复杂的对象,这种对象由许多小对象组成,而这些小对象都属于某个特定的"系列"(family). 比如说,在GUI 系统里可以设计"抽象控件工厂"(abstract widget factory),并设计三个"具体子

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

本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的问题? 是什么?通过Python语言来去实现这个设计模式,用于解决为什么中提到的问题. 怎么用?理解了为什么我们也就基本了解了什么情况下使用这个模式,不过在这里还是会细化使用场景,阐述模式的局限和优缺点. 这次的主角是简单工厂,工厂方法和抽象工厂模式,由于这几个模式联系紧密,有一定的相似性,所以放在

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

github地址:https://github.com/cheesezh/python_design_patterns 题目 如何让一个程序,可以灵活替换数据库? 基础版本 class User(): """ 用户类,模拟用户表,假设只有ID和name两个字段 """ def __init__(self): self.id = None self.name = None class SqlServerUser(): ""&qu

工厂模式 抽象工厂模式

昨天我们说到了简单工厂模式,今天我们来说说工厂模式,还有抽象工厂模式. 工厂模式,顾名思义,就是在简单工厂模式的基础上继续优化,前面的简单模式当数量多时要改的地方很多,而且比较分散,修改起来比较麻烦,那么我们可以继续封装下. var BookShop=function(type,content){ if(type in BookShop.types){ return new BookShop.types[type](content); }else{ alert("未找到对象"+type

创建型-抽象工厂模式学习

1.抽象工厂模式的意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 2.抽象工厂模式的适用性: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关的产品对象的设计以便进行联合使用时. 当你提供一个产品类库,而只想显示它们的接口而不是实现时. 3.场景描述: 考虑一个生产多种不同风格的家具的工厂(FurnitureFactory),不同风格的家具系列可以提供不同的门.窗.地板等的组合,为同一所住房可以提供不同

程序设计模式 —— 抽象工厂模式

前言 工厂?意思是创建变量的厂子?要这个干什么?为什么不直接new new new!! 定义:为创建一组相关或相互依赖的对象提供一个接口,而无需指定他们的具体类. 但是,从现在开始,请不要再使用new. “What?不使用new?你怎么写C++程序,怎么写Java程序?” 我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是工厂模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一定必须学会C++,这些代码

设计模式演练——抽象工厂模式

1.小C的故事 下面讲述的是关于x星系喵星和汪星两个宿敌星球之间的故事.首先把镜头聚焦到喵星,它是主角登场的地方.(本故事纯属虚构,如有雷同,纯属巧合)        喵星纪元9035年,汪星精锐舰队聚集在近喵星轨道,企图一举拿下喵星.大部分喵星人已经被转移到防空工事中.喵星国王下令出动最强战力迎击来敌.喵小c是战斗机编队到王牌飞行员,参加了上百场战斗,获得了很多荣誉,他是本次先头部队的一员.        “装载初级武器,装载初级防御罩,装载初级逃生仓.准备完毕,出发!”,航空港的扩音机发出急

C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】

一.引言 写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了解决[简单工厂]模式所面对的问题,它的问题就是:如果我们增加新的产品,工厂类的方法就要修改本身的代码,增加产品越多,其逻辑越复杂,同时这样的修改也是不符合[开放关闭原则OCP],对修改代码关闭,对增加代码开放.为了解决[简单工厂]的问题,我们引出了[工厂方法]模式,通过子类化工厂类,解决了工厂类责任的划分,