文档章节

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

凯文加内特
 凯文加内特
发布于 2013/09/29 14:50
字数 1554
阅读 93
收藏 0
点赞 0
评论 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等开源源码中的示例

© 著作权归作者所有

共有 人打赏支持
凯文加内特
粉丝 327
博文 667
码字总数 87615
作品 0
青岛
后端工程师
PHP设计模式(一):简介及创建型模式

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

juhenj
2014/05/15
215
2
PHP之设计模型分类(二)

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

peasant
2016/05/03
45
0
设计模式之五大创建型模式

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

小城故事_
2016/03/19
53
0
java常见的几种设计模式

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

走了丶
2017/08/27
0
0
设计模式1(创建型)

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

大海画家
2017/11/05
0
0
Java创建型模式的讨论

创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。 创建...

tequliapop
2016/01/13
96
0
Java经典设计模式之五大创建型模式(附实例和详解)

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

刘星石
2016/03/08
6
0
设计模式学习笔记-工厂模式

工厂模式 设计模式学习笔记-工厂模式 交流或更多内容请关注我的公众号:nezha_blog 我的技术博客:https://nezha.github.io 微信公众号 介绍简单工厂模式之前先通过一个披萨项目的例子来引出...

哪吒小子
2017/12/08
0
0
设计模式-创建-singleton(单例)模式

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

梦想游戏人
2016/04/28
45
0
PHP之设计模型分类(一)

经典的《设计模式》一书归纳出23种设计模式,本文按《易学设计模式》一书归纳分类如下: 1.创建型模式 前面讲过,社会化的分工越来越细,自然在软件设计方面也是如此,因此对象的创建和对象...

peasant
2016/04/29
81
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CDH的坑之Sqoop导出数据到MySQL

CDH的坑之Sqoop导出数据到MySQL 最近使用Sqoop从Hive导出数据到MySQL中,出现了一系列的问题,下面将这个问题记录一下,避免再度踩坑! 导出语句 sqoop export --connect jdbc:mysql://192....

星汉
11分钟前
0
0
Hyperledger Fabric 客户端开发三

前面两篇文章介绍了Hyperledger Fabric SDK并使用一个实例介绍如何通过SDK和Hyperledger Fabric Blockchain交互, 现在详细分析相关的过程。 首先看 enroll (登录) admin 过程。 'use stric...

十一月不远
12分钟前
0
0
PowerDesigner连接MySQL和逆向工程图

最近想梳理公司项目的表间关系,从项目后台管理系统的操作入手,以及代码的hibernate注解入手,都不算特别尽人意,于是最后还是鼓捣了一下PowerDesigner的逆向工程图,这样更直观一些。 想着...

Oo若离oO
12分钟前
0
0
威胁web应用安全的错误

一般绝大部分的web应用攻击都是没特定目标的大范围漏洞扫描,只有少数攻击确实是为入侵特定目标而进行的针对性尝试。这两种攻击都非常频繁,难以准确检测出来,许多网站的web应用防火墙都无法...

上树的熊
14分钟前
2
0
pypy2 install crypto error

install pycryptodome instead pip install pycryptodome

coord
18分钟前
0
0
Service Mesh所应对的8项挑战

Lori Macvittie 微服务架构是把双刃剑,我们享受它带来的开发速度(development velocity),却也不得不面对服务间通讯带来的复杂性问题。 目前大多数扩展容器化微服务的架构多是基于proxy-b...

好雨云帮
28分钟前
0
0
时间复杂度

1. 维基上的定义 在计算机科学中,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低...

liuyan_lc
33分钟前
0
0
js中的~符

~是js里的按位取反操作符,~~就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是 ~~true === 1,~~false === 0...

JamesView
34分钟前
0
0
webpack安装

npm install --save-dev webpack-cli

Vincent-Duan
37分钟前
0
0
实时监听EditText内容变化

主要是addTextChangedListener方法的使用 aswerEdittext.addTextChangedListener(new TextWatcher() { //编辑框的内容发生改变之前的回调方法 @Override public void before...

王先森oO
40分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部