Factory模式

原创 2005年05月07日 16:12:00

java中,创建对象通常用构造函数来完成。如下:

public class Sample {

    public Sample (){

       //一些操作

    }

}

 

然后当你创建对象的时候,你会这样写:

Sample a = new Sample();

 

这是java的常识。好了,现在假设你有一个父类Sample,子类SampleASampleB。你要在创建对象的时候,能根据不同条件返回不同的子类。你很自然的会这样写:

public class Sample {

    public Sample (String flag){

        if(flag==”A”)

           return new SampleA;

        if(flag==”B”)

           return new SampleB;

    }

}

 

假设现在需求变化了,你可能要根据条件返回10个子类。对于聪明而勤奋的你来说,这不是什么问题:

public class Sample {

    public Sample (String flag){

        if(flag==”A”)

           return new SampleA;

        if(flag==”B”)

           return new SampleB;

        if(flag==”C”)

           return new SampleC;

       //省略其他7

    }

}

 

虽然你有点头晕,不过毕竟完成老板的任务了。但你刚松了一口气,老板慢条斯理的对你说:明天我们的需求再次变化,我们需要返回一千个子类。你马上晕倒了……

 

为了完成老板的任务,你回家通宵达旦的翻资料。运气非常好的你——可能好到可以和AC米兰相比——注意到了在老式的jdbc代码里有这么一段:

class.forName(string driverName)……

没错,这是java的动态装载类机制。于是聪明的你马上动脑筋想到,是不是可以根据子类的类名来装载这个类,然后返回呢?没错,就这样做!

 

于是这个类就可以修改为:

public class Sample {

    public Sample (String className){

        return  Class.forName(className).newInstance();

    }

}

 

也就是说,如果你要返回一个SampleA,你只需传入这个参数:

”com.diegoyun.SampleA”

那么它就会返回一个对象,然后你在代码里把它转换成SampleA就可以了。

 

当然,你会意识到开始的思考可能有些欠缺。比如把Sample定义为一个接口,然后返回接口可能更好些。但不管怎样,仅仅几行代码,你就可以完成老板的任务,而不用写1000个子类的返回语句了。

 

之后你会在许多论坛看到这套解决方法,并且有个很学究的名字:

Factory模式

 

其实你内心知道,知道这个模式的名字没什么重要,重要的是:什么情况下可以使用这个模式?你会去查查字典:Factory(工厂),顾名思义,是制造大量相似产品的实体。注意这里的两个关键词:大量,和相似。当然你也知道了,在上述的情况下就可以使用。

 

不管怎样,你起码会使用Factory模式了。值得沾沾自喜一番。

设计模式总结之Factory Method Pattern(工厂方法模式)

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。...
  • cooldragon
  • cooldragon
  • 2016年08月11日 00:44
  • 1237

设计模式学习笔记--工厂(Factory)、建造(Builder)和原型(Prototype)

创建模式(Creational Pattern)一共有七种,分布是:简单工厂模式、工厂方法模式、抽象工厂模式、建造模式、原型模式、单例模式、多例模式。本篇介绍了其中的5种:简单工厂、工厂方法、抽象工厂...
  • puma_dong
  • puma_dong
  • 2014年03月31日 11:34
  • 1775

Builder与Factory,殊途同归!

Builder与Factory,殊途同归! 在设计模式的学习过程中,Builder与Factory是创建模式中两个经典的教程,给与了我们很多值得汲取的宝贵设计思想,然而Builder与F...
  • haluoluo211
  • haluoluo211
  • 2016年09月06日 16:36
  • 528

设计模式:Abstract Factory和Builder(比较区别,个人认为讲得很明白)

如果说 Factory和Prototype是同一个层次的话,那么Abstract Factory和Builder就是更高一级的层次。 1 Abstact Factory   在上面的Factory类型...
  • lovingprince
  • lovingprince
  • 2007年04月17日 10:59
  • 4223

C#设计模式——工厂方法模式(Factory Method)

一、引言   在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模...
  • ycl295644
  • ycl295644
  • 2015年07月06日 08:59
  • 756

设计模式——抽象工厂模式(Abstract Factory)

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 抽象设计模式概念:         针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设...
  • u012909091
  • u012909091
  • 2014年08月02日 16:52
  • 3590

设计模式之工厂模式(Factory Pattern)用C++实现

工厂模式(Factory Pattern):这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。它定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子...
  • z702143700
  • z702143700
  • 2015年04月10日 19:26
  • 483

Builder&Factory设计模式

推荐一篇比较好的博客http://www.cnblogs.com/happyhippy/archive/2010/09/01/1814287.html。网友的的评论也不错的! 网上关于Builder模...
  • u011450367
  • u011450367
  • 2015年01月01日 19:31
  • 582

Factory Method vs Abstract Factory

Factory Method vs Abstract Factory
  • u010373266
  • u010373266
  • 2016年12月20日 16:26
  • 313

以boost factory & boost function实现对象工厂设计模式

  本文介绍以boost factory & boost function实现C++对象工厂设计模式
  • mpforwd
  • mpforwd
  • 2010年08月05日 21:42
  • 4417
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Factory模式
举报原因:
原因补充:

(最多只允许输入30个字)