我的编程空间,编程开发者的网络收藏夹
学习永远不晚

举例讲解Python设计模式编程中对抽象工厂模式的运用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

举例讲解Python设计模式编程中对抽象工厂模式的运用

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
优点:易于交换“产品系列”,只要更改相应的工厂即可。
缺点:建立产品的时候很繁琐,需要增加和修改很多东西。

优化1:为了避免客户端有过多的逻辑判断,可以封装出一个简单工厂类来生成产品类。
优化2:为了减少简单工厂类里面的逻辑判断,可以采用“反射”机制,直接根据外部的配置文件读取出需要使用产品类的信息。


#encoding=utf-8 
# 
#by panda 
#抽象工厂模式 
 
def printInfo(info): 
  print unicode(info, 'utf-8').encode('gbk') 
   
#抽象产品A:user表 
class IUser(): 
  def Insert(self): 
    pass 
  def GetUser(self): 
    pass 
 
#sqlserver实现的User 
class SqlserverUser(IUser): 
  def Insert(self): 
    printInfo("在SQL Server中给User表增加一条记录") 
  def GetUser(self): 
    printInfo("在SQL Server中得到User表的一条记录") 
 
#Access实现的User 
class AccessUser(IUser): 
  def Insert(self): 
    printInfo("在Access中给User表增加一条记录") 
  def GetUser(self): 
    printInfo("在Access中得到User表一条记录") 
 
 
#抽象产品B:部门表 
class IDepartment(): 
  def Insert(self): 
    pass 
  def GetUser(self): 
    pass 
 
#sqlserver实现的Department 
class SqlserverDepartment(IUser): 
  def Insert(self): 
    printInfo("在SQL Server中给Department表增加一条记录") 
  def GetUser(self): 
    printInfo("在SQL Server中得到Department表的一条记录") 
 
#Access实现的Department 
class AccessDepartment(IUser): 
  def Insert(self): 
    printInfo("在Access中给Department表增加一条记录") 
  def GetUser(self): 
    printInfo("在Access中得到Department表一条记录") 
 
 
#抽象工厂 
class IFactory(): 
  def CreateUser(self): 
    pass 
  def CreateDepartment(self): 
    pass   
 
#sql server工厂 
class SqlServerFactory(IFactory): 
  def CreateUser(self): 
    return SqlserverUser() 
  def CreateDepartment(self): 
    return SqlserverDepartment() 
 
#access工厂 
class AccessFactory(IFactory): 
  def CreateUser(self): 
    return AccessUser() 
  def CreateDepartment(self): 
    return AccessDepartment() 
   
#优化一:采用一个简单工厂类,封装逻辑判断操作 
class DataAccess(): 
#  db = "Sqlserver" 
  db = "Access" 
  @staticmethod 
  def CreateUser(): 
    if (DataAccess.db == "Sqlserver"): 
      return SqlserverUser() 
    elif(DataAccess.db == "Access"): 
      return AccessUser() 
  @staticmethod 
  def CreateDepartment(): 
    if (DataAccess.db == "Sqlserver"): 
      return SqlserverDepartment() 
    elif(DataAccess.db == "Access"): 
      return AccessDepartment() 
     
#优化二:采用反射机制,避免使用太多判断 
##以下信息可以从配置文件中获取 
DBType = 'Sqlserver' #'Access' 
DBTab_User = 'User' 
DBTab_Department = 'Department' 
 
class DataAccessPro(): 
#  db = "Sqlserver" 
  db = "Access" 
  @staticmethod 
  def CreateUser(): 
    funName = DBType + DBTab_User 
    return eval(funName)() #eval 将其中的字符串转化为python表达式 
  @staticmethod 
  def CreateDepartment(): 
    funName = DBType + DBTab_Department 
    return eval(funName)() 
     
def clientUI(): 
  printInfo("n--------抽象工厂方法--------") 
  factory = SqlServerFactory() 
  iu = factory.CreateUser() 
  iu.Insert() 
  iu.GetUser() 
  id = factory.CreateDepartment() 
  id.Insert() 
  id.GetUser() 
   
  printInfo("n--抽象工厂方法+简单工厂方法--") 
  iu = DataAccess.CreateUser() 
  iu.Insert() 
  iu.GetUser() 
  id = DataAccess.CreateDepartment() 
  id.Insert() 
  id.GetUser() 
   
  printInfo("n-抽象工厂方法+简单工厂方法+反射-") 
  iu = DataAccessPro.CreateUser() 
  iu.Insert() 
  iu.GetUser() 
  id = DataAccessPro.CreateDepartment() 
  id.Insert() 
  id.GetUser()   
  return 
 
 
if __name__ == '__main__': 
  clientUI(); 

类图:

查看图片

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

实例:人民群众喜闻乐见的披萨店例子这里又可以搬出来了,这次我们根据抽象工厂模式的特点,用不同原材料制作不同口味的披萨,创建不同原材料的工厂,不同实体店做出口味不同的披萨。创建一个产品家族(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 += "  面团: %sn" % self.dough.to_string() if self.dough else ""
    string += "  酱汁: %sn" % self.sauce.to_string() if self.sauce else ""
    string += "  奶酪: %sn" % self.cheese.to_string() if self.cheese else ""
    string += "  文蛤: %sn" % 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()

结果:


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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

举例讲解Python设计模式编程中对抽象工厂模式的运用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

举例讲解Python设计模式编程中对抽象工厂模式的运用

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 优点:易于交换“产品系列”,只要更改相应的工厂即可。 缺点:建立产品的时候很繁琐,需要增加和修改很多东西。 优化1:为了避免客户端有过多的逻辑判断,可以封装
2022-06-04

举例讲解Python设计模式编程的代理模式与抽象工厂模式

代理模式 Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A) 提供'代理'的方式方式访问。比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介 你先设想:一个对象提供rgb三种颜色值,我想获
2022-06-04

Golang设计模式中抽象工厂模式详细讲解

抽象工厂模式用于生成产品族的工厂,所生成的对象是有关联的。如果抽象工厂退化成生成的对象无关联则成为工厂函数模式。比如本例子中使用RDB和XML存储订单信息,抽象工厂分别能生成相关的主订单信息和订单详情信息
2023-01-11

实例讲解Python设计模式编程之工厂方法模式的使用

工厂方法模式是简单工厂模式的进一步抽象和推广,它不仅保持了简单工厂模式能够向客户隐藏类的实例化过程这一优点,而且还通过多态性克服了工厂类过于复杂且不易于扩展的缺点。在工厂方法模式中,处于核心地位的工厂类不再负责所有产品的创建,而是将具体的创
2022-06-04

举例讲解Python设计模式编程中的访问者与观察者模式

访问者模式 我觉得Visitor模式是在补修改已有程序结构前提下,通过添加额外的访问者完成对代码功能的拓展 为什么这样用?当你的类层次较多,在某层结构中增加新的方法,要是在基类上面添加或者变更,可能破坏原来的设计, 有兼容问题,所以只在需要
2022-06-04

举例讲解Python中的Null模式与桥接模式编程

Null模式 我想每个人都有一种经历,为了获取某属性,但是有时候属性是None,那么需要你做异常处理, 而假如你想节省这样的条件过滤的代码,可以使用Null模式以减少对象是否为None的判断 python的例子 我举个不是很通用的例子,只是
2022-06-04

详解设计模式中的工厂方法模式在Python程序中的运用

工厂方法(Factory Method)模式又称为虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,属于类的创建型模式。在工厂方法模式中,父类负责定义创建对象的公共接口,而子
2022-06-04

使用简单工厂模式来进行Python的设计模式编程

计模式的目的是让代码易维护、易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的。 简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式。这个模式的基本工作方式: 通过一个工厂来决定创建哪种具体的产品实例。
2022-06-04

实例解析Python设计模式编程之桥接模式的运用

我们先来看一个例子:#encoding=utf-8 # #by panda #桥接模式 def printInfo(info): print unicode(info, 'utf-8').encode('gbk') #抽象类:手机品牌
2022-06-04

详解Python设计模式编程中观察者模式与策略模式的运用

观察者模式 观察者模式:又叫发布订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时,会通知所有观察者对象,是他们能自动更新自己。 代码结构class Topic(object):"""
2022-06-04

Python设计模式编程中Adapter适配器模式的使用实例

将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 应用场景:希望复用一些现存的类,但是接口又与复用环境要求不一致。 模式特点:将一个类的接口转换成为客户希望的另外一个接口。 分类:类适配
2022-06-04

Python设计模式编程中解释器模式的简单程序示例分享

模式特点:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。 我们来看一下下面这样的程序结构:class Context:def __init__(self):self.input=""self
2022-06-04

实例解析Java设计模式编程中的适配器模式使用

适配器模式的主要作用是在新接口和老接口之间进行适配,通过将一个类的接口转换成客户期望的另一个接口,让原本不兼容的接口可以合作无间,本文以实例解析Java设计模式编程中的适配器模式使用,需要的朋友可以参考下平时我们会经常碰到这样的情况,有了两
2023-05-31

使用Mixin设计模式进行Python编程的方法讲解

Mixin模式是一种在python里经常使用的模式,适当合理的应用能够达到复用代码,合理组织代码结构的目的。 Python的Mixin模式可以通过多继承的方式来实现, 举例来说,我们自定义一个简单的具有嵌套结构的数据容器:class Sim
2022-06-04

深入解析Python设计模式编程中建造者模式的使用

建造者模式:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。 基本思想 某类产品的构建由很多复杂组件组成; 这些组件中的某些细节不同,构建出的产品表象会略有不同; 通过一个指挥者按照产品的创建步骤来一步步执行产品的
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录