[Python设计模式] 05 - 工厂方法模式

除非需求非常明确,通常一开始无法确定哪些地方需要通过设计模式来优化代码的组织,因此通常的做法是先根据当前需求编写简单实现,等到变化发生时立即采取行动,分析、抽象、隔离这些变化。抽象不是越早越好,应当拒绝不成熟的抽象。**

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

基本思想

  • 定义一个抽象的工厂接口类
  • 定义一个抽象的产品接口类
  • 根据需要从产品接口派生产品子类
  • 对于每一个产品子类,从工厂接口派生工厂子类,负责该产品的创建
  • 客户端根据实际需要,调用工厂子类,创建所需要的产品。

代码框架

拿简单工厂模式中的动物工厂来举例说明

class Animal(object):
    def eat(self, food):
        raise NotImplementedError()

class Dog(Animal):
    def eat(self, food):
        print '狗吃', food

class Cat(Animal):
    def eat(self, food):
        print '猫吃', food

class AnimalFactory(object):
    def create_animal(self):
        raise NotImplementedError()

class DogFactory(Animal):
    def create_animal(self):
        return Dog()

class CatFactory(AnimalFactory):
    def create_animal(self):
        return Cat()

def client():
    animal_factory = DogFactory()
    animal = animal_factory.create_animal()
    animal.eat('肉骨头')

    animal_factory = CatFactory()
    animal = animal_factory.create_animal()
    animal.eat('鱼骨头')

下面是简单工厂模式的实现:

class Animal(object):
    def eat(self, food):
        raise NotImplementedError()

class Dog(Animal):
    def eat(self, food):
        print '狗吃', food

class Cat(Animal):
    def eat(self, food):
        print '猫吃', food

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

def client():
    animal = create_animal('dog')
    animal.eat('肉骨头')
    animal = create_animal('cat')
    animal.eat('鱼骨头')

看起来工厂方法模式要复杂很多啊,也没觉得比简单工厂模式有什么好处,为什么还要用工厂方法模式呢?
简单工厂模式的优点很明显,工厂函数封装了逻辑判断,客户端使用负担要小很多。相应的问题也很明显,要增加新的产品类型,就需要修改工厂函数,这违背了开闭原则。
但是工厂方法模式似乎绕了一圈又回到原始时代了,下面写不就行了吗,何必外面套一层Factory:

class Animal(object):
    def eat(self, food):
        raise NotImplementedError()

class Dog(Animal):
    def eat(self, food):
        print '狗吃', food

class Cat(Animal):
    def eat(self, food):
        print '猫吃', food
def client():
    dog = Dog()
    dog.eat('肉骨头')

    cat = Cat()
    cat.eat('鱼骨头')

工厂方法模式,对于需要做强类型检查的语言比如Java、C++等在组织代码时是有好处的。对于Python这种动态语言来说,感觉体现不出太多价值,或许我还没有理解工厂方法模式的真谛。

原文地址:http://www.isware.cn/python-design-pattern/02-factory-method/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,985评论 1 15
  • 简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建...
    justCode_阅读 1,217评论 1 9
  • 今天学习下最常见的工厂模式,工厂模式细分下来有三大类: 他们的目标都是一样的:封装对象的创建。但是实现手段和使用场...
    西木柚子阅读 2,180评论 7 28
  • 设计原则: 要依赖抽象,不要依赖具体类 目录 本文的结构如下: 什么是工厂方法模式 为什么要用该模式 模式的结构 ...
    w1992wishes阅读 1,367评论 0 6
  • 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者...
    RamboLI阅读 774评论 0 1