Java设计模式:工厂模式

问题提出

Java的工厂模式与现实生活中的工厂的模型是很相似的。工厂是用来做什么?当然是用来生成产品。因此在Java的工厂模式的关键点就是如何描述好产品和工厂这2个角色之间的关系。

下面来仔细描述一下不同的关系以及对应的设计模式

1)单一产品系,工厂只生产一种类型的产品

让我们简单构思一下简单的工厂生产模型,既然只有一个产品,那只需要一个车间就好了,一个车间分别生产三种不同种类的小汽车。好,下面看看简单工厂的设计模式。

//定义小汽车接口:ICar.javapublic interface ICar {}
public class TopCar implements ICar {}
public class MidCar implements ICar {}
public class LowCar implements ICar {}

public class CarSimpleFactory {    public static final String TOPTYPE = "toptype";    public static final String MIDTYPE = "midtype";    public static final String LOWTYPE = "lowtype";    private CarSimpleFactory(){            }    public static ICar create(String mark){        ICar obj = null;        if(mark.equals(TOPTYPE)){            obj = new TopCar();        }        else if(mark.equals(MIDTYPE)){            obj = new MidCar();        }        else if(mark.equals(LOWTYPE)){            obj = new LowCar();        }        return obj;    }}

简单工厂功能类编写步骤:

1.编写抽象产品接口

2.编写具体产品子类

3.编写工厂类。简单工厂类的特点,它是一个具体的类,非接口型抽象类。有一个重要的create()方法,并且用if...else或者switch开发创建所需产品。因为可以把这个简单工厂类实现成一个工具类,所以直接用静态方法就可以了,如有必要甚至可以把构造方法私有化。

下面考虑一种情形,工厂扩张啦!可以加工生产超级高档型的汽车。在上面的生产模式下要怎么修改呢?

1)新增ICar子类SuperCar

2)修改工厂类SimpleCarFactory中的create()方法,添加判断分支。

子类SuperCar的添加是必然的,然而能不能不用修改工厂类呢?

或者从另一个角度分析,在一个生产线上生产几种不同种类的产品,这样我们还需要对每个产品加以判断种类来分类。当然,假若只有2种种类要区分,这样当然没问题,但是若是有多个种类要区分呢?显然,不能在一条生产线上生产多种种类的产品!那意味着对于每一种种类我们都需要一条生产线。这就是所谓的工厂模式!

public abstract class AbstractFactory {    public abstract ICar create();}

 

 

 

而观察代码,只要有ICar.java,AbstractFactory.java这两个文件,其他具体产品类,工厂类源文件没有,编译也能通过。

对于AbstractFactory,可以定义为抽象类,也可以定义为接口。这里的create()是抽象方法,没参数,表明在具体的子类工厂中创建某个具体产品。

工厂方法的主要特征是:当需求分析发生变化是,只需要增加和删除相应的类,而不是修改已有的类。例如添加超高档的小汽车,只需要增加SuperCar以及SuperFactory两个类即可。所以工厂方法更易于软件的二次开发以及维护。

当然啦,一个工厂很有可能不止生成一种产品。下面看看多产品系。

2)多产品系,特征相同

UML图与工厂模式基本没什么区别,这里就不再画了。

一般来说,简单工厂和工厂模式都是单产品系的,而对于上面这种架构,称之为抽象工厂。但从本质上来说,抽象工厂和工厂模式是统一的。这里就不再述说。

3)多产品系,部分特征相同

public abstract class AbstractFactory {    /**     * 多产品系,小汽车和公共汽车都有高,中档类型,小汽车有低档类型,而公共汽车没有     */}
public abstract class AbstractFactory1 extends AbstractFactory {    public abstract ICar createCar();   //产生小汽车对象    public abstract IBus createBus();   //产生公共汽车对象}
public abstract class AbstractFactory2 extends AbstractFactory {    public abstract ICar createCar(); //产生小汽车对象}

这里着重看看AbstractFactory,AbstractFactory1,AbstractFactory2.

1)具有相同特征的小汽车和公共汽车放在相同的工厂里面

2)该类也是抽象类,表明“特征是多个”。这里特征表示“高中低档”。

工厂模式大概就讲到这里,看到这里,相信很多人都有一种,工厂模式原来也不过如此。但是,个人觉得无论什么设计模式,看上去都似乎很好理解很容易。但是,当遇到问题需要自己分析设计的时候,就顿时没了头绪。

原因大概有2个,一是对这种设计模式还并不是十分熟悉和理解,二当然就是没有实践过。闲话不多说,下面让我们操刀实践一波。

例子:编写读文件功能。读取文本文件,包括GBK,UTF-8.编码下的文本文件,要求获得全文内容;读取图像文件,包括BMP,GIF,JPG文件,要求获得图像宽度,长度,每一点的三基色信息。

代码如下:

读取文本文件方法需要两个参数:文件名和编码方式;而读取图像文件需要一个参数:文件名。而根据题意,两种读取文件返回值类型有所差异。

如何用接口屏蔽方法参数个数,返回值类型的差异,是定义接口的关键。

public interface IRead<T> {    //如何用接口屏蔽方法参数个数,返回值类型的差异,这是定义接口的关键    T read(String ... in);}

 

 

 

public abstract class AbstractFactory {
  //定义抽象工厂    public abstract IRead create();}
public class TextFactory extends AbstractFactory {    public IRead create(){        return new TextRead();    }}
public class ImageFactory extends AbstractFactory {    public IRead create(){        return new ImageRead();    }}

对于上面抽象工厂类其实并不够完善,如何选择具体工厂类没有体现。解决方法有两种。一是像简单工厂那样添加选择分支。二是使用反射。

下面的代码是使用了反射技术

public abstract class AbstractFactory {    public abstract IRead create();    static AbstractFactory create(String className){        AbstractFactory factory = null;        try{            Class c = Class.forName(className);            factory = (AbstractFactory)c.newInstance();        }        catch (Exception ex){            ex.printStackTrace();        }        return factory;    }}

运用反射技术,实现了更加灵活的自动工厂选择功能。当添加新具体工厂类的时候,不需要修改AbstractFactory类。

时间: 2024-11-17 23:17:00

Java设计模式:工厂模式的相关文章

java设计模式--工厂模式

总结 (1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的. (2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成. (3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类.它针对的是有多个产品的等级结构.而工厂方法模式针对的是一个产品的等级结构. 一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java

Java设计模式の工厂模式

-------------------------------------------------------- 目录:  一.序言 二.简单工厂模式 三.工厂方法模式 四.简单工厂和工厂方法模式的比较 五.抽象工厂模式 六.总结. -------------------------------------------------------- 一.序言 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Facto

java设计模式—工厂模式

[参考:http://www.cnblogs.com/forlina/archive/2011/06/21/2086114.html] 总结 (1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的. (2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成. (3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类.它针对的是有多个产品的等级结构.而工厂方法模式针对的是一个产品的

Java设计模式——工厂模式

一.工厂模式的作用 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 二.工厂模式的分类 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品: 2)工厂方法模式(Factory Method):又称为多形性工厂: 3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品: 区别:这三种模式从上到下逐步抽象,并且更具一般性. 三.简单工厂模式

Java 设计模式 工厂模式

工厂模式概念: 1 实例化对象,用工厂方法代替new操作. 2 工厂模式包括工厂方法模式和抽象工厂模式. 3 抽象工厂模式是工厂方法模式的扩展. 工厂模式意图: 1 定义一个接口来创建对象,由子类来决定实例化哪些类. 2 实例化工作交给子类去实现. 适合工厂模式的情况: 1 创建一组类似的对象. 2 不能预见哪个类实例需要实例化. 3 考虑扩展性,不依赖产品类实例化细节. 工厂方法模式类图: 抽象工厂模式类图: 工厂方法模式中工厂生产同一类的多个产品,抽象工厂模式中一个具体工厂生产由多个产品等级

Java 设计模式 -- 复合模式之二

接着上文的鸭鸣例子:Java 设计模式 -- 复合模式之一 上文中,我们的鸭鸣实现了 装饰者模式  适配器模式  工厂模式的结合 现在,又需要进行改动了,上文,是可以统计一群鸭子的叫声,现在需要能够观察个别鸭子的行为 引入观察者模式: 任何想被观察的Quackable都必须实现下面的接口 public interface QuackObservable { public void registerObserver(Observer observer); public void notifyobs

设计模式---工厂模式---生产水果

设计模式---工厂模式 需要一个基本的抽象类:相当一个基本的工厂 需要若干个具体类:相当若干个产品 需要工具类:相当工厂中机器,用来选择不同的产品生产 需要主类:相当顾客所想的订单 主类 ----> 工厂类 ----> 产品类 ---> 产品具体类 老板根据顾客的订单,在工具堆中选择合适的,然后去工厂中生产适合的产品,返回给顾客 优势:能够在不修改原先的代码情况,增加所需的类与方法. 不足:会增多类文件的数量 接口:提供的内容,相当于协议,即外界使用此接口时,接口的内容是不允许外界对接口

设计模式——工厂模式学习

1.概念 工厂模式定义:实例化对象,用工厂方法代替new操作.达到解耦的目的(避免硬编码耦合).工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式. 工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例

设计模式-工厂模式[Factory]

先看下一个简单的实现: 1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description: Sample子类的标示 5 * BeanEm.java Create on 2014年7月11日 下午2:37:58 6 * @author [email protected] 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Res

一起学java设计模式--代理模式(结构型模式)

代理模式 应用软件所提供的桌面快捷方式是快速启动应用程序的代理,桌面快捷方式一般使用一张小图片来表示(Picture),通过调用快捷方式的run()方法将调用应用软件(Application)的run()方法.使用代理模式模拟该过程,绘制类图并编程实现. package ProxyPattern; interface Software { void run(); } class Application implements Software { public void run() { Syste