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设计模式——简单工厂模式(Simple Factory Pattern)

定义:简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工            厂模 式中...

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

抽象工厂模式产生的动机:        为了更清晰地理解工厂方法模式,需要先引入两个概念:        产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海...

Java设计模式之三——工厂模式

转眼又是一个周末,我收获了很多,你呢? 一、前言 记得上个周末详细讲到了策略模式,并且最后还引出了一个策略模式带来的问题——导致系统中的类急剧膨胀。今天,就来介绍如何解决策略模式带来的问题,那就是...

Java设计模式之——工厂模式

工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类。 工厂模式主要用一下几种形态: 1:简单工厂(Simple Factory) 2:工厂方法(Factory Meth...

JAVA设计模式——工厂模式

一、工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。   工厂模式在《Java与模式》中分为三类: 1)简单工厂模式(Simple Fa...

【Java设计模式02】——工厂模式

转载:http://blog.csdn.net/xu__cg/article/details/52909769 工厂模式:主要是为创建对象提供接口,将创建对象的过程隔离起来,实现了创建者与调用...

设计模式——用Java实现工厂模式

该工厂模式的UML图:

浅谈JAVA设计模式之——抽象工厂模式(AbstractFactoty)

一、定义:     提供创建对象的接口 二、为何使用     工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。      ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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