文档章节

工厂方法模式-创建型模式2

凯文加内特
 凯文加内特
发布于 2013/09/29 14:50
字数 1554
阅读 93
收藏 0

        工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

定义:
定义一个用于创建对象的接口,让子类决定实例化哪个类,Factory Method使一个类的实例化延迟到子类。

结构:

说明:
       Product接口:工厂方法创建的对象的接口。
       ConcreteProduct类,接口的具体实现。
       Creator类,创建器,声明个工厂方法,通常返回一个Product类型的实例对象。
       ConcreteCreator类,具体的创建器对象,覆盖实现Creator定义的工厂方法,返回具体的Product 实例。

具体代码

/**
 * 类说明: 创建产品对象的接口 
 * Time: 2013-9-27 下午4:52:49 
 * @author 凯文 加内特
 * Company: http://weibo.com/u/3165936675
 */
public interface Product {

}

/**
 * 类说明: 实现
 * Time: 2013-9-27 下午4:53:55 
 * @author 凯文 加内特
 * Company: http://weibo.com/u/3165936675
 */
public class ConcreteProduct implements Product {

}

/**
 * 类说明: 创建器
 * Time: 2013-9-27 下午4:54:37 
 * @author 凯文 加内特
 * Company: http://weibo.com/u/3165936675
 */
public abstract class Creator {

	protected abstract Product factoryMethod();

	public void someOperation() {
		Product p = factoryMethod();
	}
}

/**
 * 类说明: 具体的创建器对象
 * Time: 2013-9-27 下午4:56:16 
 * @author 凯文 加内特
 * Company: http://weibo.com/u/3165936675
 */
public class ConcreteCreator extends Creator {
	protected Product factoryMethod() {
		return new ConcreteProduct();
	}
}

模式应用代码:
 将数据导入到DB、txt文件中,代码如下:

/**
 * 类说明: 导出的文件对象的接口,相当结构中的Product * Time: 2013-10-8 下午5:34:33 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */
public interface ExportFileApi {
	/**
	 * 导出内容成为文件
	 * @param data 示意:需要保存的数据
	 * @return 是否导出成功
	 */
	public boolean export(String data);

/**
 * 类说明: 导出成数据库备份文件形式的对象,相当结构中的ConcreteProduct
 * Time: 2013-10-8 下午5:34:19 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */
public class ExportDB implements ExportFileApi {
	public boolean export(String data) {
		//简单示意一下,这里需要操作数据库和文件
		System.out.println("导出数据" + data + "到数据库备份文件");
		return true;
	}
}

/**
 * 类说明: 导出成文本文件格式的对象,相当结构中的ConcreteProduct
 * Time: 2013-10-8 下午5:35:42 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */
public class ExportTxtFile implements ExportFileApi {
	public boolean export(String data) {
		//简单示意一下,这里需要操作文件
		System.out.println("导出数据" + data + "到文本文件");
		return true;
	}
}

/**
 * 类说明: 实现导出数据的业务功能对象,相当结构中的ConcreteCreator,此处没有用抽象类
 * Time: 2013-10-8 下午5:34:52 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */
public class ExportOperate {
	/**
	 * 导出文件
	 * @param type 用户选择的导出类型
	 * @param data 需要保存的数据
	 * @return 是否成功导出文件
	 */
	public boolean export(int type, String data) {
		//使用工厂方法
		ExportFileApi api = factoryMethod(type);
		return api.export(data);
	}

	/**
	 * 工厂方法,创建导出的文件对象的接口对象
	 * @param type 用户选择的导出类型
	 * @return 导出的文件对象的接口对象
	 */
	protected ExportFileApi factoryMethod(int type) {
		ExportFileApi api = null;
		//根据类型来选择究竟要创建哪一种导出文件对象
		if (type == 1) {
			api = new ExportTxtFile();
		} else if (type == 2) {
			api = new ExportDB();
		}
		return api;
	}
}

/**
 * 类说明: 客户端类
 * Time: 2013-10-8 下午5:34:02 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */
public class Client {
	public static void main(String[] args) {
		//创建需要使用的Creator对象
		ExportOperate exportOperate = new ExportOperate();
		//调用输出数据的功能方法,传入选择到处类型的参数
		exportOperate.export(1, "测试数据");
	}
}

如果扩展一个导入到xml文件中的功能,则添加一个ExportOperate2类,继承ExportOperate类,并重写factoryMethod方法,再添加一个ExportXml类并实现导出接口ExportFileApi即可,原先代码不动,甚是方便,满足了开闭原则,示例代码如下:

/**
 * 类说明: 扩展ExportOperate对象,加入可以导出XML文件
 * Time: 2013-10-8 下午5:35:32 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */
public class ExportOperate2 extends ExportOperate {
	/**
	 * 覆盖父类的工厂方法,创建导出的文件对象的接口对象
	 * @param type 用户选择的导出类型
	 * @return 导出的文件对象的接口对象
	 */
	protected ExportFileApi factoryMethod(int type) {
		ExportFileApi api = null;
		//可以全部覆盖,也可以选择自己感兴趣的覆盖,
		//这里只想添加自己新的实现,其他的不管
		if (type == 3) {
			api = new ExportXml();
		} else {
			//其他的还是让父类来实现
			api = super.factoryMethod(type);
		}
		return api;
	}
}


/**
 * 类说明: 导出成xml文件的对象
 * Time: 2013-10-8 下午5:35:51 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */
public class ExportXml implements ExportFileApi {
	public boolean export(String data) {
		//简单示意一下
		System.out.println("导出数据" + data + "到XML文件");
		return true;
	}
}

/**
 * 类说明: 客户端类
 * Time: 2013-10-8 下午5:34:02 
 * @author 凯文加内特
 * Company: http://weibo.com/u/3165936675
 */
public class Client {
	public static void main(String[] args) {
		//创建需要使用的Creator对象
		ExportOperate exportOperate2 = new ExportOperate2();
		//下面变换传入的参数来测试参数化工厂方法
		exportOperate2.export(1, "Test1");
		exportOperate2.export(2, "Test2");
		exportOperate2.export(3, "Test3");
	}
}


使用场景:
如果一个类需要创建一个接口的对象,但是又不知道具体的实现,这种情况下可以选择工厂方法模式。把创建对象的工作延迟到子类去实现。

优点和缺点
优点:
可以在不知道具体实现的情况下进行编程。
容易扩展, 当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。而 简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。 
缺点:
具体产品对象与工厂方法的耦合性

留给自己的问题:
1.jdk、spring等开源源码中的示例

© 著作权归作者所有

共有 人打赏支持
凯文加内特
粉丝 337
博文 674
码字总数 96570
作品 0
青岛
后端工程师
私信 提问
java常见的几种设计模式

设计模式 1、概述 1)设计模式(Design pattern):是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结; 2)分类: 创建型模式(创建对象的): 单例模式、抽象工厂模式、建造者...

走了丶
2017/08/27
0
0
设计模式之五大创建型模式

一、概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 (2)结构型模式,共七种:适配器模式、装饰器模式、代理...

小城故事_
2016/03/19
53
0
PHP之设计模型分类(二)

创建型模式: 单例模式、工厂模式(简单工厂、工厂方法、抽象工厂)、创建者模式、原型模式。 1、单例模式 目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 应用场景:数据库...

peasant
2016/05/03
45
0
设计模式-创建-singleton(单例)模式

单例模式是一种创建型的模式,适用于 全局只有一个对象的类, 结构图 只有一个静态 实例变量 和一个静态 函数 外部通过Instance() 静态函数来获取 唯一实例 存在的问题: 线程安全性 可用dou...

梦想游戏人
2016/04/28
45
0
设计模式1(创建型)

类设计考虑的问题 1.类的组织与表示 聚类分析、类的再抽象、类的拆分、类的复用性... ... 2.行为的组织与表示 行为的分解、行为的参与者、行为的分组与接口、行为的差异... ... 3.属性的组织...

大海画家
2017/11/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS配置Tomcat监听80端口,虚拟主机

Tomcat更改默认端口为80 更改的配置文件是: /usr/local/tomcat/conf/server.xml [root@test-a ~]# vim /usr/local/tomcat/conf/server.xml # 找到 Connector port="8080" protocol="HTTP/1......

野雪球
今天
5
0
《稻盛和夫经营学》读后感心得体会3180字范文

《稻盛和夫经营学》读后感心得体会3180字范文: 一代日本经营之圣稻盛和夫凭借刻苦勤奋的精神以及深植于佛教的商业道德准则,成为了“佛系”企业家的代表人物。在《稻盛和夫经营学》“领导人...

原创小博客
今天
3
0
java框架学习日志-5(常见的依赖注入)

依赖注入(dependency injection) 之前提到控制反转(Inversion of Control)也叫依赖注入,它们其实是一个东西,只是看的角度不同,这章详细说一下依赖注入。 依赖——指bean对象创建依赖于...

白话
今天
4
0
红外接收器驱动开发

背景:使用系统的红外遥控软件没有反应,然后以为自己接线错误,反复测试,结果烧坏了一个红外接收器,信号主板没有问题。所以自己开发了一个红外接收器的python驱动。接线参见https://my.os...

mbzhong
今天
2
0
ActiveMQ消息传送机制以及ACK机制详解

AcitveMQ是作为一种消息存储和分发组件,涉及到client与broker端数据交互的方方面面,它不仅要担保消息的存储安全性,还要提供额外的手段来确保消息的分发是可靠的。 一. ActiveMQ消息传送机...

watermelon11
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部