文档章节

Factory模式与Prototype模式的异同

ruyees
 ruyees
发布于 2014/10/05 11:47
字数 1023
阅读 18
收藏 0
点赞 0
评论 0

工厂模式实现的生产产品的功能,关键是利用了继承的特性。也就是说,你生成的产品,一定是由同一个抽象产品类派生出来的。所以,在工厂模式下,你如果要生成一类产品,就要引入一个抽像产品类,然后再由它派生出具体产品。同样,在原型模式中,你完全可以同样定义一个这样的“抽象产品--具体产品”层次,再利用具体产品本身的clone功能来产生具体产品本身。从而达到实现工厂模式功能的目的。可能说到这,大家有点糊涂了。实际上,在原型模式中,每个具体产品就扮演了工厂模式里的具体工厂的角色(为什么会这样,其实很简单,因为,每个具体产品都具有生成
自己拷贝的功能?从这种意义上讲,难道这不正是工厂的作用吗?)。另外,要在Java中利用原形模式实现工厂模式的功能,则更为简单,因为object已经为我们实现了clone函数,且对于clone方法,Java中默认是:如果A是父类且A实现了clone函数,B是A的子类,则B不用实现clone函数,它只要调用父类的clone函数,Java就会在运行时动态地为我们生成正确的B的对象。理解这点的关键在于,所有类实现的clone操作都是调用object的clone方法。这也就是说,我上面所说的父类A根本就不用自己实现clone方法,而仅仅是调用父类(object)的clone方法而已。好,到了这,读者也许又有疑问了,既然所有的cloen操作都是由object实现的,而在java中所有的自定义类默认都是由object派生而来,那这样的话,应该所有的类都自动就具有了clone自己的能力?
    确实,如果object不将它的clone函数声明为protect的话,情况的确如此。但Java为了安全方面的原因,所以没有将clone方法公开,而是声明为保护类型,这样的话,子类是不可以直接调用object类的clone方法的,而必须做到如下两点:
       1.必须实现Cloneable接口;
       2.必须声明一个clone方法,来调用object的clone函数;
       Java在调用父类的clone函数时,都会在运行时动态地进行检查,如果发现调用的类不符合上面的任何一点,则会抛出一个异常。
    明白了上面的原因,那么如果我们希望某个类具备clone自身的能力,那么,我们可以这样做:
       1.直接按上面所说,自己实现clone操作;
       2.声明一个抽象父类,实现上面的clone操作并将它声明为公开方法,再由此类派生出子类,这样,所有的  子类只要调用父类的clone方法,就能够正确地拷贝自己。
    通常,我们都是使用第一种方式,但在我们现在讨论的如何用原型模式实现工厂模式的功能的问题中,我们最好是采用第二种方式。
    最后,让我们通过具体的代码来看看如何用Prototype模式实现工厂模式的功能。

package prototype;
/**
 *************************************
  * @Title   Person.java
  * @Author  张作强
  * @Date    2010-8-11
  * @Comment 定义抽象类Person
 *************************************
 */
public abstract class Person implements Cloneable {
	public String Gender;

	public String getGender() {
		return Gender;
	}

	public void setGender(String gender) {
		Gender = gender;
	}

	public Object clone(){
		Object object = null ;
		try {
			object = super.clone();//调用父类,即Object的clone()
		} catch (CloneNotSupportedException exception) {
			System.err.println("Person is not Cloneable");
		}
		return object;
	}
}

 

 

package prototype;

public class Man extends Person {
	public Man(){
		setGender("男");
	}
}

 

 

package prototype;

public class Test {
	public static void main(String[] args) {
		try {
			Person pM = (Person)Class.forName("prototype.Man").newInstance();
			System.out.println("==================");
			System.out.println("** 显示中文性别:" + pM.getGender());
			pM.setGender("Man");
			System.out.println("** 显示英文性别:" + pM.getGender());
			
			System.out.println("==================");
			Person pW = (Person) pM.clone();
			pW.setGender("女");
			System.out.println("** 显示中文性别:" + pW.getGender());
			pW.setGender("Woman");
			System.out.println("** 显示英文性别:" + pW.getGender());
			System.out.println("==================");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

本文转载自:http://zuoqiang.iteye.com/blog/735066

共有 人打赏支持
ruyees
粉丝 3
博文 71
码字总数 0
作品 0
深圳
产品经理
Java创建型模式的讨论

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

tequliapop ⋅ 2016/01/13 ⋅ 0

收集的关于设计模式的java例子集合

终于有功夫坐下来把所有Design Pattern好好整理一通了,这可是个盘算了快十年的想法了。 ==============================================================================================...

晨曦之光 ⋅ 2012/05/21 ⋅ 0

设计模式之原型模式(Prototype)(五)

动机 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 如何应对这种变化?如何向“客户程序...

NickHomeSelf ⋅ 2016/08/21 ⋅ 0

创建型模式(2)

Singleton模式解决的是实体对象个数的问题。 除了Singleton之外,其他创建型模式解决的都是New所带来的耦合关系。 Factory Method,Abstract Factory,Builder都需要一个额外的工厂类来负责实...

晨曦之光 ⋅ 2012/04/24 ⋅ 0

设计模式分类

一.创建型模式(主要解决对象的创建) 1.简单工厂模式(Simple Factory) 2.工厂方法模式(Factory Method) 3.抽象工厂模式(Abstract Factory) 4.创建者模式(Builder) 5.原型模式 (Prototype) ...

黄孟 ⋅ 2016/10/16 ⋅ 0

GOF设计模式分类

  GoF模式的分类   1.根据目的准则分类     就是说,指定的模式用来完成什么样的工作。可分为三种:     (1) Creational (创建型):与对象创建有关。     (2) Structural (结...

forest13 ⋅ 2013/09/21 ⋅ 0

使用 Python 实现设计模式的集合--python-patterns

python-patterns是使用Python实现设计模式的集合。设计模式(Design Patterns)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码...

匿名 ⋅ 2017/03/07 ⋅ 0

创建型模式:Prototype 原型模式

创建型模式:Prototype 原型模式 1、依赖关系的倒置 1)抽象不应该依赖于实现细节,实现细节应该依赖于抽象。 2)不好的做法:抽象A直接依赖于实现细节B 3)oo做法:抽象A依赖于抽象B,实...

flyhighly ⋅ 2011/04/24 ⋅ 0

第一章,思想为源.设计模式的概述及分类

一,设计模式概述 关于模式这一概念, 最早出现在城市建筑领域 Christopher Alexander 的一本关于建筑的书(The Timeless Way of Building)。他在书中明确给出了模式的概念: 每一个模式描述了一...

水门-kay ⋅ 2016/07/23 ⋅ 1

创建型模式(1)

1.抽象工厂模式(Abstract Factory) 提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们的具体类。 2.建造者模式(Builder) 将一个复杂对象的构建与其表示向分...

晨曦之光 ⋅ 2012/04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部