设计模式解析之工厂模式 (一)

工厂模式在“创造模式”中是比较难理解的,困难之处并不在于工厂模式的定义本身,困惑的地方在于为什么要使用工厂模式,或者说是必须使用工厂的理由。

工厂模式的定义

Define an interface for creating
an object, but let the classes that implement the interface decide which
class to instantiate.

The Factory method lets a class defer
instantiation to subclasses.

对于使用工厂模式的疑问在于,产品类所定义产品实体是在客户逻辑中真正使用的目标,如果产品类已经抽象,使用者只需要将产品的子类实例化后使用产品的接口或父类,为什么一定要使用工厂类,多此一举。

即使使用工厂类,实际上是工厂的子类去实例化具体的产品,对于使用者来说,去判断使用哪一个工厂和去判断使用哪一个产品没有本质的区别,为什么在设计的时候还需要加入工厂的接口,和工厂的继承类,增加复杂度呢。

关键的问题在于工厂模式定义中的最后一句,工厂的子类决定如何实现子产品,实现局域化和特性化的产品。

产品的实例化,指的是子产品的实例化,子产品在实现的时候,是不是需要有特性化和局域化的需求,成为是否使用工厂模式的判断标准。

更简单的说,如果所有的产品在的实例化只是一个简单的new,可以解决,那使用工厂就完全是多此一举。而各种产品,虽然可以维持统一接口, 但在实例化时是需要不同的,甚至复杂的处理,或者更复杂的逻辑处理,那么,工厂的目的就是,将复杂的不同的实例化逻辑统一成统一的接口,来屏蔽使用者对于实例化产品是对其复杂逻辑的理解与实现,而统一使用简单的工厂接口。

就以图中类为例

class Light{
public:
    Light(){}
    virtual void TurnOn() = 0;
}
class BulbLight : public {
public:
    BulbLight()
    void TurnOn() {
        // power 5v
    }
}
class TubeLight : public {
public:
    TubeLight(){}
    void TurnOn(){
        // power 220v
    }
}

如果做两个工厂类BulbFactory和TubeFactory对BulbLight和TubeLight进行实例化,使用者仍然需要决定并实现Factory的实例,这同实现具体的Light类没有区别,也没有益处,反而增加工作量和复杂度。

然而,Light子类的构造变得复杂时,情况变不一样了

class BulbLight : public {
    Power power;
public:
    BulbLight(Power bettery) : power(bettery) {}
    void Fill(Gas current_gas);
    void TurnOn() {
        // power 5v
    }
}
class TubeLight : public {
    Cable wire;
public:
    TubeLight(Cable power) : wire(power) {}
    void TurnOn(){
        // power 220v
    }
}

对于使用者来说,不去向BulbLight和TubeLight的设计者(文档)了解实例化的细节,将很难使用两个子类

这将是Factory的优势所在,Light子类的设计者,同时提供Factory接口的产品实例化方法,屏蔽了产品本身实例化的复杂逻辑

如果实例化之后还有其他本地化的逻辑,如Fill之类,工厂模式的特性会更具体的体现出来。

时间: 2024-10-10 06:51:33

设计模式解析之工厂模式 (一)的相关文章

【设计模式】简单工厂模式

以面向对象的思想和简单工厂模式,写一个C++计算器程序,代码如下: #include <iostream> using namespace std; class Operation { public: Operation(double left, double right) { lhs = left; rhs = right; } const double GetLeft() const { return lhs; } const double GetRight() const { retur

设计模式之简单工厂模式

设计模式之简单工厂模式 动机:         不暴露实例化逻辑来创建对象.通过公共的接口创建新的对象.         这是一个简单的实现,客户端需要一个product,但是client不直接使用new对象,而是通过提供需要的对象信息来找factory得到新的product.         这个factory实例化一个具体的product并返回(转化成抽象的类),client段使用这个抽象的类而不用考虑它具体的实现. 应用举例:        也许工厂模式是使用最多的模式之一.举个例子,一个

设计模式之抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 最大的好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体工厂即可使用不同的产品配置. 他使具体创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离. 下面的代码还使用了反射与XML. 代码如下: using System; using System.Collections.Ge

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

创建型设计模式之抽象工厂模式: 一.含义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类. 具体来说, 为一组具有相同约束(属性)的对象,提供一个接口,这个接口下有不同的实现,每个实现类对应一种类型的约束(一种具体的属性),同时提供该类型的约束(属性)下所有对象的创建方法 二.代码说明 1.主要有两个角色 1)一组互相影响的产品线(对象),也叫做产品族 2)抽象工厂类及其实现类 抽象工厂类:在N个产品族中,在抽象工厂类中就应该有N个创建方法 实现类:具体实现类是产品族的具体

设计模式初探—简单工厂模式

为什么要学习设计模式? 可重用.可维护.可扩展.灵活性好 什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 简单工厂模式的好处? (1)将具体业务和实现进行分离 (2)将多个具体业务之间进行解耦 解决的问题? 单独的类来创造

设计模式 2/23 工厂模式(二)

先要给各位同学灌输一个思想,世间本无设计模式,用的人多了,自然就有了 没有太明显的优劣之分,只道是谁更适合 如果没法理解<<工厂>>,建议阅读上一篇 设计模式 2/23 工厂模式(一) ,毕竟是一个渐进明细的过程,急不来的 这一篇分享 工厂模式 回想一下简单工厂,我们把具体类的实例化工作放在一个工厂方法里面来执行. 同时故意在上一篇提到了开放-封闭原则. 仔细想象看看上一篇的代码,到底有没有遵守这个原则,或者说这个原则有没有被严格意义的遵守,或者说遵守的程度是多少. 如果我们要新增

【幻化万千戏红尘】qianfengDay10-java基础学习:成员内部类、静态内部类、局部和匿名内部类,设计模式之简单工厂模式

课程回顾: 接口:1.属性:public\static\final2.方法:public\abstract 多态:1.静态化(编译时)多态重载2.动态化(运行时)多态重写对象转型 1.向上转型 2.向下转型 今日内容:内部类:定义在类的内部的类1.成员内部类格式:[修饰符] class 类名 { }内部不能有静态的属性和方法,可以访问外部类的属性,也可以调用外部类的方法 在静态方法中的使用格式:外部类 外对象=new 外部类();成员内部类 对象名=外对象.new 成员内部类(); 2.静态内部

JS设计模式(动态工厂模式)

<!--引入的核心JS文件--> <script type="text/javascript" src="CommonUtil.js"></script> <script type=text/javascript charset=utf-8> <!--JS设计模式(细粒度工厂模式)--> //搭建一个工厂环境 买什么车——(去什么店)卖车的店——卖车——生产车 //卖车店 super Shop 只有卖车的方

iOS设计模式 - (3)简单工厂模式

iOS设计模式 - (3)简单工厂模式           by Colin丶 转载请注明出处:              http://blog.csdn.net/hitwhylz/article/details/40381721 一.简述 简单工厂模式(FACTORY),通过面向对象的封装,继承和多态来降低程序的耦合度.将一个具体类的实例化交给一个静态工厂方法来执行. 该模式中的角色包括: 工厂类(Simple Factory): 只包含了创建具体类的静态方法. 抽象产品(Product):