简单工厂模式

来源:互联网 发布:阿里巴巴淘宝城四期 编辑:程序博客网 时间:2024/06/10 09:22

本文转自http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/simple_factory.html


一、创建型模式

创建型模式对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件结构更加清晰,外界对于这些对象只需要知道他们共同的接口,而不清楚其具体的实现细节,使整个系统更符合单一职责原则。


创建型模型在创建什么,由谁创建,何时创建等都为软件设计者提供了尽可能大的灵活性。创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到整个系统独立的目的。


二、模式动机

考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮,这些按钮都源于一个基类,不过继承基类之后不同的子类修改了部分属性从而使他们可以呈现出不同的外观。我们希望在提供这个按钮的时候,不需要知道这些具体按钮类的名字,只需要知道该按钮类的一个参数,并提供一个调用方法方便的方法,把该参数传入即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。


三、模式定义

简单工厂模式又称静态工厂方法,他属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例,简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。


四、模式结构

简单工厂模式包含如下角色:

1、Factory 工厂角色

工厂角色负责实现创建所有实例的内部逻辑


2、Product  抽象产品角色

抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的接口。


3、ConcreteProduct  具体产品角色

具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实现


../_images/SimpleFactory.jpg


五、时序图


../_images/SimpleFactory.jpg


六、代码分析

if ( "A" == proname ){return new ConcreteProductA();}else if("B" == proname){return new ConcreteProductB();}


七、模式分析

将对象的创建和对象本身业务分开处理可以降低系统耦合度,使得两者修改起来都相对容易。

在调用工厂类的工厂方法时,由于工厂是静态方法,使用起来很方便,可通过类名直接调用,而且只需要传入一个简单的参数。

简单工厂模式的最大问题是工厂类的职责相对过重,增加新的产品时需要修改工厂类的判断逻辑,这一点与开闭原则是相违背的。

简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无需知道其创建细节。


八、优缺点

1、优点

工厂类含有必要的逻辑判断,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品的责任,而仅仅消费产品,简单工厂模式通过这种方法实现了对责任的分割,他提供了专门的工厂类用户创建产品。

客户端无需知道所创建的的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,可以通过简单工厂模式可以减少使用者的记忆量。

通过引入配置文件 ,可以在不修改客户端任何代码的情况下增加新的具体产品类,在一定程度上提高系统的灵活性。


2、缺点

由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

使用简单工厂模式将会增加系统中类的个数,在一定程度上增加了系统的复杂度和理解难度。

系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑复杂不利于系统的扩展和维护。

简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构


九、适用环境

工厂类负责创建的对象比较少,由于创建的对象比较少,不会造成工厂方法中的业务逻辑太过复杂。

客户端只知道传入工厂类的参数,对于如果创建对象不关心,客户端既不需要知道创建细节,只需要知道所对应 参数。


十、总结

创建型模式对类的实例化过程进行了抽象,能够将对象的创建与对象的使用分离。

简单工厂模式又称为静态工厂方法模式,他属于类创建型模式,在简单工厂模式中,可以根据参数的不同返回不同类的实例,简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常有共同的父类。

简单工厂模式包含三个角色:工厂角色负责实现创建所有实例的内部逻辑,抽象产品角色是所创建角色的父类,负责描述所有实例所共有的接口,具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。

简单工厂模式的要点在于:当你需要什么,只需要传入一个正确的参数,就可以获取你所需要的对象,而无需知道其创建细节

简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法将会非常复杂。

简单工厂模式适用情况包括:工厂类负责创建的对象比较少,客户端只知道传入工厂类的参数,对于如何创建对象不关心。



0 0