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

计模式的目的是让代码易维护、易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的。

简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式。这个模式的基本工作方式: 通过一个工厂来决定创建哪种具体的产品实例。

下面是一个简单的工厂实例:

def create_animal(name):
 if name == 'dog':
  return Dog()
 elif name == 'cat':
  return Cat()

animal = create_animal('dog')
animal.eat('some food')

create_animal就是一个工厂,各种动物就是产品,该工厂根据name来决定产出什么动物产品。产品应该具有一个基本特性,同一个工厂出产的所有产品都是一个系列,都具有相同的功能,比如动物都吃食物。

简单工厂模式的好处是可以将产品对象的细节封装在其实现类的内部,改变一个产品对象具体实现不会影响其他产品。可扩展性强,当需要新增产品类型时,只需要添加对应的实现类,然后修改工厂,增加一个判断分支即可。修改工厂函数带来的风险比较低。

另外一个比较典型的适合简单工厂模式的例子是计算器,计算器需要支持各种计算操作,比如加、减、乘、除、平方、立方、平方根、阶乘等等。那么这里的工厂就是要创建各种操作算法对象,每种操作算法对象都支持一个求值方法。

def create_operator(op):
 if op == '+':
  return AddOperation()
 elif op == '-':
  return SubOperation()
 elif op == '*':
  return MulOperation()
 elif op == '/':
  return DivOperation()

op = create_operator('+')
op.Calc(1, 2)

前面提到,每个工厂生产的产品都是一个系列的,因此产品类通常会从同一个抽象基类派生,但不是必须的。

简单工厂模式的组成要素:
工厂函数:负责具体产品对象的创建工作,是该模式的核心。当场景比较复杂时,可能需要用一个工厂类来负责产品的创建。
以及产品的抽象接口或抽象类、抽象所有产品的公共接口、具体产品类、抽象接口的具体实现类。

缺点:
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中
它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

使用场景:
工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。


eg:采用简单工厂模式实现计算器

#encoding=utf-8
#
#by panda
#简单工厂模式 

class OperateBase():
 result = 0;
 def GetResult(self):
  return self.result; 

class OperationAdd(OperateBase):
 def __init__(self, NumA, NumB):
  self.result = NumA + NumB;
 def GetResult(self):
  return self.result;   

class OperationSub(OperateBase):
 def __init__(self, NumA, NumB):
  self.result = NumA - NumB;
 def GetResult(self):
  return self.result; 

class OperationMult(OperateBase):
 def __init__(self, NumA, NumB):
  self.result = NumA * NumB;
 def GetResult(self):
  return self.result; 

class OperationDiv(OperateBase):
 def __init__(self, NumA, NumB):
  self.result = NumA / NumB;
 def GetResult(self):
  return self.result; 

class OperationFactory():
 @staticmethod
 def createOperate(operate, NumA, NumB):
  optList = {
  '+':OperationAdd,
  '-':OperationSub,
  '*':OperationMult,
  '/':OperationDiv,
  }
  oper = OperateBase()
  if(optList.has_key(operate)):
   oper = optList[operate](NumA, NumB);
  return oper 

def clientUI():
 opt = raw_input("please input a operation(+-*/): ");
 NumA = raw_input("please input the first number: ");
 NumB = raw_input("please input the second number: ");
 oper = OperationFactory.createOperate(opt, float(NumA), float(NumB))
 print "Restlt: ", oper.GetResult()
 return 

if __name__ == '__main__':
 clientUI();

UML类图如下:

时间: 2016-02-27

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

代理模式 Proxy模式是一种常用的设计模式,它主要用来通过一个对象(比如B)给一个对象(比如A) 提供'代理'的方式方式访问.比如一个对象不方便直接引用,代理就在这个对象和访问者之间做了中介 你先设想:一个对象提供rgb三种颜色值,我想获得一个对象的rgb三种颜色,但是我不想让你获得蓝色属性,怎么办? class Proxy(object): def __init__(self, subject): self.__subject = subject # 代理其实本质上就是属性的委托 def _

Python设计模式之抽象工厂模式

python面向对象编程入门,我们需要不断学习进步 """抽象工厂模式的实现""" import random class PetShop: """宠物商店""" def __init__(self, animal_factory=None): """宠物工厂是我们的抽象工厂.我们可以随意设置.""" self.pet_fact

python中getattr函数使用方法 getattr实现工厂模式

看了下函数本身的doc 复制代码 代码如下: getattr(object, name[, default]) -> value Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y. When a default argument is given, it is returned when the attribute doesn't exist; without it, an exception i

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

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 优点:易于交换"产品系列",只要更改相应的工厂即可. 缺点:建立产品的时候很繁琐,需要增加和修改很多东西. 优化1:为了避免客户端有过多的逻辑判断,可以封装出一个简单工厂类来生成产品类. 优化2:为了减少简单工厂类里面的逻辑判断,可以采用"反射"机制,直接根据外部的配置文件读取出需要使用产品类的信息. #encoding=utf-8 # #by panda #抽象工厂模式 def p

python3设计模式之简单工厂模式

在Python3环境下,调试实现了<大话设计模式>中简单工厂模式,通过定义单独的工厂类,完成对具体的产品的实例化,参考链接 具体实现见代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # Date : 2017-10-15 21:46:28 # Author : John # Version : V1.001 # Func : class Operator(object): """docstring for Ope

python版简单工厂模式

什么是简单工厂模式 工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品:在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的.从软件开发的角度来说,这样就有效的降低了模块之间的耦合. 简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类.简单工厂实例化的类具有相同的接口或者基类,在子类比较固定并不需要扩展时,可以使用简单工厂.如数据库生产工厂就是简单工厂的一个应用 采用简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实

Python设计模式之简单工厂模式实例详解

本文实例讲述了Python设计模式之简单工厂模式.分享给大家供大家参考,具体如下: 简单工厂模式(Simple Factory Pattern):是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 下面使用简单工厂模式实现一个简单的四则运算 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'Andy' ''' 大话设计模式 用任意一种面向对象语言实现一个计算器控制台程序.要求输入两个数和运算符号,得到

浅析Python 简单工厂模式和工厂方法模式的优缺点

前言 在<设计模式>一书中工厂模式提到了: 工厂方法模式(Factory Method) 抽象工厂模式 (Abstract Factory) 但是在实际过程中还有一种工厂模式经常被使用,那就是 简单工厂模式(Simple Factory).有一种常见的分类的方法:根据产品是由具体产品还是具体工厂可以分为 工厂方法模式 和 简单工厂模式:根据工厂的抽象程度可以分为 工厂方法模式 和 抽象工厂模式.接下来会通过例子对比简单工厂模式和工厂方法模式. 工厂意图 定义一个用于创建对象的接口,让子类决定实

Python设计模式之工厂模式简单示例

本文实例讲述了Python设计模式之工厂模式.分享给大家供大家参考,具体如下: 工厂模式是一个在软件开发中用来创建对象的设计模式. 工厂模式包涵一个超类.这个超类提供一个抽象化的接口来创建一个特定类型的对象,而不是决定哪个对象可以被创建. 为了实现此方法,需要创建一个工厂类创建并返回. 当程序运行输入一个"类型"的时候,需要创建于此相应的对象.这就用到了工厂模式.在如此情形中,实现代码基于工厂模式,可以达到可扩展,可维护的代码.当增加一个新的类型,不在需要修改已存在的类,只增加能够产生

C#基于简单工厂模式实现的计算器功能示例

本文实例讲述了C#基于简单工厂模式实现的计算器功能.分享给大家供大家参考,具体如下: 子类拥有父类除私有之外的所有属性字段和方法 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 工厂方法实现计算器 { /// <summary> /// 计算器类(抽象类,由子类重写) /// </sum

js简单工厂模式用法实例

本文实例讲述了js简单工厂模式用法.分享给大家供大家参考.具体实现方法如下: <!DOCTYPE html> <html> <head> <title>简单工厂模式</title> </head> <body> <script> //简单工厂模式 var BicycleShop = function(){}; BicycleShop.prototype ={ sellBicycle : function(mod

以Java代码为例讲解设计模式中的简单工厂模式

1. 简单工厂模式简介 简单工厂模式(Simple Factory),又被称为"静态工厂方法模式".它属于"创建模式"(创建对象的模式),并且是"工厂方法"模式的一种特殊实现. 通常,我们利用简单工厂模式来进行类的创建.例如,获取线程池对象,就是通过简单工厂模式来实现的.它的结构图如下所示: 工厂:工厂是简单工厂模式的核心,提供了对外接口.客户端或其它程序要获取Product对象,都是通过Factory的接口来获取的. 抽象产品:抽象产品是(许多

浅析Java设计模式编程中的单例模式和简单工厂模式

单例模式 动机 有时候只有一个类的实例是很重要的.比如,一个系统应该只有一个窗口管理实例. 单例模式是最简单设计模式:类负责实例化自己,确保只有一个实例,并且提供一个访问这个实例的入口. 目的 1. 确保只有一个实例被创建. 2. 提供访问这个实例的入口. 使用final确保被创建一次,private的构造函数确保不被实例化.public的getInstance方法确保外部能够访问.下面是饿汉模式: public class Singleton { private static final Si