文档章节

简单工厂模式-创建型模式1

凯文加内特
 凯文加内特
发布于 2013/09/03 17:18
字数 868
阅读 99
收藏 0

    从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。

定义
提供一个创建对象实例的功能,无须关心具体实现,被创建实例的类型可以是接口、抽象类、具体类。

结构:

说明:
Api:功能接口;
ImpA,ImpB:接口实现;
Factory:工厂,选择合适的实现来创建接口Api对象;
Client:客户端,通过Factory来获取Api对象,实现面向接口编程(封装隔离)。

具体代码:
Api接口:

/**
 * 类说明: 接口
 * Time: 2013-9-3 下午3:10:59 
 * @author 凯文 加内特
 * Company:http://weibo.com/u/3165936675
*/
public interface Api {
	public void operation(String s);
}
ImpA类:
package staticFactoryMethod;
/**
 * 类说明: 实现A
 * Time: 2013-9-3 下午3:11:35 
 * @author 凯文 加内特
 * Company: http://weibo.com/u/3165936675

*/

public class ImpA implements Api { @Override public void operation(String s) { System.out.println("ImpA实现s=" + s); } }
ImpB类:
package staticFactoryMethod;
/**
 * 类说明: 实现B
 * Time: 2013-9-3 下午3:11:26 
 * @author 凯文 加内特
 * Company: http://weibo.com/u/3165936675
 */
public class ImpB implements Api {
	@Override
	public void operation(String s) {

		System.out.println("ImpB实现 s=" + s);
	}
}
Factory类:
package staticFactoryMethod;

/**
 * 类说明: 工厂类
 * Time: 2013-9-3 下午3:11:16 
 * @author 凯文 加内特
 * Company: http://weibo.com/u/3165936675
*/
public class Factory {
	public static Api createApi(int condition) {
		Api api = null;
		if (condition == 1) {
			api = new ImpA();
		}
		if (condition == 2) {
			api = new ImpB();
		}
		return api;
	}
}
Client类:
package staticFactoryMethod;

/**
 * 类说明: 客户端调用 
 * Time: 2013-9-3 下午3:11:07 
 * @author 凯文 加内特
 * Company:  http://weibo.com/u/3165936675
*/
public class Client {
	public static void main(String[] args) {
		Api clientApi = Factory.createApi(1);
		clientApi.operation("客户端调用");
	}
}
使用场景
工厂类负责创建的对象比较少(如提供多数据库的连接)

优点和缺点

优点:
帮助封装,封装具体实现,使调用者实现面向接口编程;
解耦,调用类和具体实现类解耦;
静态工厂方法可以返回当前类的子类的实例,这一特性可以在创建松耦合的系统接口时发挥作用。
缺点:
研磨设计模式书中说,增加了客户端的复杂度,客户端地知道参数的功能和意义,就像你管一个工厂要一头猪,你都不知道猪是什么?你要个P,我认为给客户端增加不了多少复杂度;
如果说简单的工厂的缺点,我感觉工厂类的扩展是一个缺点,但是可以根据配置或者反射Class.forName("类名")的方式来避免这种问题;
由于简单工厂很容易违反高内聚责任分配原则(设计原则的单一职责?有知道的告诉下,谢谢。),因此一般只在很简单的情况下应用。

留给自己的问题: 
1.工厂类的方法不用静态方法,然后客户端new工厂类不行么?看了一个帖子(http://apple277315540.blog.163.com/blog/static/4872344820096191299693/),说的很有道理,如果用new那你需要控制工厂类的构造方法,如果工厂类有多个构造方法的话,客户端调用的时候地明白各个构造方法的参数,用静态方法一目了然;
 2.《Effective java》书中提到考虑用简单工厂模式替代构造方法,看完设计模式和重构然后看这本书;
 3.jdk,spring源码中的应用例:
http://www.blogjava.net/killme2008/archive/2007/04/11/109675.html
陆续探索中......

© 著作权归作者所有

凯文加内特
粉丝 341
博文 701
码字总数 110786
作品 0
青岛
后端工程师
私信 提问
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
286
2
设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu
2017/11/02
0
0
设计模式之抽象工厂模式(创建型)

模式定义 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。 模式角色 抽象...

smileNicky
01/01
0
0
javascript 设计模式之工厂(Factory)模式

工厂模式介绍 工厂模式是一个创建型的模式,主要就是创建对象。其中工厂模式又分为简单工厂模式和抽象工厂模式。简单工厂模式是通过工厂方法确定创建 对应类型的对象。抽象工厂模式是通过子类...

hlxiong
2014/04/14
380
0
前端设计模式(1)--工厂模式

写在前面 设计模式有23种,按大类归类的话可以分为三大类:创建型(如:工厂模式、单例模式、原型模式等),结构型模式(如装饰器模式、代理模式等),行为型(如:观察者模式、迭代器模式等...

duffy
02/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

不就是SELECT COUNT语句吗,竟然能被面试官虐的体无完肤

数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查。 在数据库的增删改查操作中,使用最频繁的就是查询操作。而在所有查询操作中,...

HollisChuang
26分钟前
4
0
乐观锁和悲观锁

乐观锁和悲观锁 在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性的问题 事务的特性:原子性、一致性、隔离性、持久性 1、丢失修改:T1和T2两个事务对同一个数据进行修改,T1先...

大瑞清_liurq
35分钟前
5
0
Scrum敏捷价值观与原则

Scrum是一种迭代式增量软件开发过程,通常用于敏捷软件开发。如果还不知道Scrum敏捷开发的朋友们,请出门左转,点击 Scrum 了解。 敏捷价值观 个体和互动 高于 流程和工具 工作的软件 高于 ...

醉美閑聖
35分钟前
4
0
android焦点

final RelativeLayout relativeLayout=new RelativeLayout(context); relativeLayout.setClickable(true); relativeLayout.setFocusable(true); rel......

安卓工程师王恒
37分钟前
4
0
IP地址分配与中继设备简介

1. TCP/IP模型 TCP/IP协议是在OSI参考模型出现之间就被开发的,并广泛部署在计算机网络中。但是,后来由于概念混淆,TCP/IP模型的层次和名称往往与OSI模型的层次名称相互借用。如图1.所示。 ...

xiangyunyan
38分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部