Java设计模式——工厂模式

原创 2016年08月30日 15:03:13

简介

概念:实例化对象,用工厂方法代替new操作。工厂模式包括工厂方法模式和抽象工厂模式。抽象工厂模式是工厂方法模式的扩展。

意图:定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。工厂方法把实例化的工作推迟到子类中去实现。

适用情况:有一组类似的对象需要创建。在编码时不能预见需要创建哪种类的实例。系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节。

实现的核心:多态(父类对象指向子类实例)。

主要目的:降低耦合。

工厂模式的任务是实例化对象,代替new操作,但是平时里我们不是经常用到new的么?这么说是没错,平日里自己做练习,写测试,你再写十几个类专门写个工厂模式,除非是在练习工厂模式,否则,YBB,呵呵。但是,在实际的项目中,new操作是少见的,假如,项目初期,有个类叫LogUtil,项目中几乎所有的类中都使用new实例化了这个类,然而有一天,项目组感觉这个名字不好,要改成LogsUtil……好,不就百十来个么,小意思,我一天就修改完了。然后第二天,冒着两个黑眼圈参加讨论的时候,项目组一致同意,将LogsUtil命名为LogsUtils……

简单工厂

上面的小例子中LogUtil如果是用简单工厂进行实例化,那么修改个类名也就是几秒钟的事:

//定制抽象产品接口
public interface ILogUtil {
 
}
//定制具体产品子类
public class LogUtil4DB  implementsILogUtil {
 
 
}
public class LogUtil4File  implementsILogUtil {
 
 
}
public class LogUtil implements ILogUtil {
<spanstyle="white-space:pre">     </span>
}
//简单工厂类:它是一个具体的类,非接口或抽象类。其中一个重要的create()方法,利用if…else或switch开关创建所需产品,并返回。
//其中create()方法通常是静态的,所以也称为静态工厂。
public class LogUtilSimpleFactory {
private static final String FORDB ="logutil4db";
private static final String FORFILE ="logutil4file";
private static final String LOGUTIL ="logutil";
 
public static ILogUtil create(String mark){
ILogUtil obj = null;
if(mark.equals(FORDB)){
obj = new LogUtil4DB();
}else if(mark.equals(FORFILE)){
obj = new LogUtil4File();
}else if(mark.equals(LOGUTIL)){
obj = new LogUtil();
}
return obj;
}
}
此时,只要修改LogUtil类的类名及工厂中的类名就可以了(当然,这个场景有点不合适,现在的编辑器大多可以在重命名类的时候将关联的地方一同修改,就这样理解)

工厂方法模式

工厂方法模式与简单工厂模式类似,但是较之多了一层:抽象工厂;还是拿上面的例子来说,产品没有变,但是工厂多了一个上层:总部(一般是接口后抽象类,规定具体的工厂应该实现哪些方法),比如,富士康有很多的加工部门,但是每个具体的加工厂肯定是有一个总部来告诉它加工什么,怎么加工就是具体工厂的事了。上面例子中IlogUtil及其子类不变,变的是工厂类:

//抽象工厂(总部;规定继承该抽象类的具体工厂的职能是create,产品是ILogUtil)
public abstract classAbstractLogUtilFactory {
         publicabstract ILogUtil create();
}
//具体工厂,生产LogUtil
public class LogUtilFactory extendsAbstractLogUtilFactory {
 
 
@Override
public ILogUtil create() {
return new LogUtil();
}
}
//具体工厂,生产LogUtil4DB
public class LogUtil4DBFactory extendsAbstractLogUtilFactory {
@Override
public ILogUtil create() {
return new LogUtil4DB();
}
}
//具体工厂,生产LogUtil4File
public class LogUtil4FileFactory extendsAbstractLogUtilFactory {
 
@Override
public ILogUtil create() {
return new LogUtil4File();
}
}

抽象工厂模式

此模式与工厂方法模式类似,但是较之多了一些产品,而且,这些产品不是ILogUtil的子类,比如DataSource,那么抽象方法也有些变化:多了生产DataSource的抽象方法。然后具体的工厂都会去实现或继承这个方法,达到生产DataSource的目的,实际上就是将两个不同的工厂方法模式进行合并。代码与工厂方法模式类似:

//抽象工厂
public abstract classAbstractLogUtilFactory {
        public abstract ILogUtil createLogUtil()
<span style="white-space:pre">	</span>public abstract IDataSource createDataSource();
}

总结

简单工厂与工厂方法模式类似,都是单一产品系的,因为工厂类中只定义了一种返回值类型的方法,而抽象工厂模式中定义了多种返回值类型的方法(不同的方法,返回值不同),实际上就是将两个不同的工厂方法模式进行合并。

三种方式的关系简单表述为:由简单工厂衍生出工厂方法模式,通过将工厂类拆分成抽象工厂类(或接口)实现;由工厂方法模式衍生出抽象工厂模式,通过将两个不同产品系的工厂进行合并实现。

版权声明:本文为博主原创文章,未经博主允许不得转载。

庖丁解牛——Java反射解析一个类

一、什么是反射     反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序。能够分析类能力的程序称为反射(reflective...

Java设计模式——模板方法模式

简介 定义 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 生活实例 张明和李明去参加高考考试,考试的步骤都...

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

  • 2013年08月10日 15:54
  • 6KB
  • 下载

Java设计模式——工厂模式

工厂模式是一种比较常见的创建模式。有时,可能你使用了工厂模式而你却还不知道你已经使用了它。至少我感觉下面说的第一种简单工厂模式,你是已经很熟悉了。...

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

工厂模式工厂模式主要是为创建对象提供接口,将创建对象的过程隔离起来,实现了创建者与调用者的分离,提高了程序的灵活性。 核心本质: 实例化对象,用工厂方法代替new操作。 将选择实现类、创建对象统一管...
  • xu__cg
  • xu__cg
  • 2016年10月24日 12:39
  • 962

JAVA设计模式(一)——简单工厂模式

1、简单工厂模式         简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。 2、角色与职责 2.1 工...
  • ljtyzhr
  • ljtyzhr
  • 2014年12月18日 21:43
  • 413

设计模式(java)2——简单工厂模式

简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式的UML图: ...

java设计模式——工厂模式

转载:http://blog.csdn.net/u013510614/article/details/37736879 一、工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离...

学习笔记——JAVA设计模式<2>工厂模式

工厂模式 实现了创建者和调用者的分离 详细分类 简单工厂模式 工厂方法模式 抽象工厂模式 面向对象设计的基本原则 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java设计模式——工厂模式
举报原因:
原因补充:

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