学习笔记02--工厂模式

工厂模式是一种最常用的创建型设计模式。

详解可以参考http://www.runoob.com/design-pattern/abstract-factory-pattern.html下的一条笔记,很是生动形象。

1. 了解工厂模式

术语“工厂”表示一个负责创建其它类型对象的类。通常情况下,作为一个工厂的类有一个对象以及与它关联的多个方法。客户端使用某些参数调用此方法,之后,工厂据此创建所需类型的对象,将它返回给客户端。工厂具有以下优点:

  1. 松耦合,即对象的创建可以独立于类的实现
  2. 客户端无需了解创建对象的类,依旧可以使用它来创建对象
  3. 可以轻松在工厂中添加其它类来创建其它类型的对象,而无需更改客户端代码
  4. 工厂可以重用现有对象,如果是客户端直接创建对象的话,总是会创建一个新的对象

ps:个人理解,工厂即用来管理许多的类,客户端想要哪个类,工厂便根据参数返回哪个类的对象

Factory模式有3种变体:

  1. 简单工厂模式:允许接口创建对象,但不会暴露对象的创建逻辑
  2. 工厂方法模式:允许接口创建对象,但使用哪个类来创建对象,则是交由子类决定
  3. 抽象工厂模式:创建一系列相关对象而无需指定/公开其具体类的接口,该模式能够提供其它工厂的对象,在其内部创建其它对象。

2. 简单工厂模式

如图是简单工厂的UML图,这里,客户端使用的是Factory类,该类具有create_type()方法。当客户端使用类型参数调用create_type()方法时,Factory会根据传入的参数,返回Product1或Product2。

在下面的代码中,将创建一个名为Animal的抽象产品,Animal是一个抽象的基类(ABSMeta是Python的特殊元类,用来生成类Abstract),它带有方法do_say()。我们利用Animal接口创建了两种产品(Cat和Dog),并实现了do_say()方法来提供这些动物相应的叫声。ForestFactory是一个带有make_sound()方法的工厂。根据客户端传递的参数类型,它就可以在运行时创建适当的Aniaml实例。

from abc import ABCMeta, abstractmethod

class Animal(metaclass=ABCMeta):
    @abstractmethod
    def do_say(self):
        pass
    
class Dog(Animal):
    def do_say(self):
        print('Bhow Bhow !!')
        
class Cat(Animal):
    def do_say(self):
        print('Meow Meow !!')
        
# forest factory defined
class ForestFactory(object):
    def make_sound(self, object_type):
        return eval(object_type)().do_say()
    
# client code
if __name__ == '__main__':
    ff = ForestFactory()
    animal = input('Which animal should make_sound Dog or Cat?')
    ff.make_sound(animal)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值