Gof23种设计模式(4)——原型模式(Prototype)

2020年8月6日14:18:28 评论 70

1 基础知识

1.1 标准定义

原型模式标准定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

1.2 分析和说明

原型模式是指用原型实例指定创建对象的种类,并且通过拷贝(克隆)这些原型创建新的对象。原型模式也是一种创建性模式。当一个系统应该独立于它的产品创建、构成和表示,以及当要实例化的类是在运行时刻指定时,可使用原型模式。原始模型模式适用于任何的等级结构。原型模式的结构如图1。原型模式的缺点是每一个类都必须配备一个克隆方法。

Prototype的角色包括客户(Client)角色、抽象原型(Prototype)角色和具体原型(Concrete Prototype)角色。Prototype用来声明一个拷贝自身的接口,ConcretePrototype用来实现一个拷贝自身的操作;Client用来让一个原型拷贝自身从而创建一个新的对象

Gof23种设计模式(4)——原型模式(Prototype)

图1 原始模型模式的标准结构图

 客户(Client)角色:客户类提出创建对象的请求。

 抽象原型(Prototype)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体原型类所需的接口。

 具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。

2 应用场景举例

比如公司对于各个产品都有自己的宣传资料。每个宣传资料的组成都是首先对公司进行介绍。其次是对公司组织结构介绍,中间内容才是对产品的技术介绍,案例说明,最后还要留下公司的通信联系方式。所以,对于不同产品的宣传资料中关于公司介绍、组织机构和公司的通信地址都是一样的。这样就可以采用Prototype。从基本的公司产品资料中克隆出来一个介绍模板,然后根据具体产品再说明各个产品的技术参数。用例见图2所示。

Gof23种设计模式(4)——原型模式(Prototype)

图2 原始模型模式的用例图

在这里可以把AbstractPrototype理解为抽象原型(Prototype)角色。CompanyBaseIntroduction是具体原型(Concrete Prototype)角色。其实现类图如下:

Gof23种设计模式(4)——原型模式(Prototype)

图3 原始模型模式的类图

原始模型实现的顺序图如图4所示,实现顺序描述:
①创建一个company实例对象;
②再新建一个departA实例对象,从company实例对象克隆过来;
③获得departA实例对象;
④调用departA的addSomeIntrouction方法;
⑤显示departA的内容。

Gof23种设计模式(4)——原型模式(Prototype)

图4 原始模型模式实现顺序图

3.Java的实现程序代码

Java程序实现主要包括AbstractPrototype抽象类文件,CompanyBaseIntroduction类文件2个文件。其关系如图3所示。下面分别列出这2个文件的程序代码,最后列出测试代码并显示输出结果。

AbstractPrototype抽象类程序代码清单01所示。

程序代码清单01

public abstract class AbstractPrototype {

	public AbstractPrototype cloneMyself() {
		return this;
	}

	public void addSomeIntrouction(String topic, String content) {
	}

	public void deleteSomeIntrouction(String key) {
	}

	public void showIntrouction() {
	}

}

CompanyBaseIntroduction类文件程序代码清单02所示。

程序代码清单02

public class CompanyBaseIntroduction extends AbstractPrototype {

	private Map<String, String> introductionMap = new HashMap<String, String>();

	public CompanyBaseIntroduction() {
	}

	public CompanyBaseIntroduction(Map<String, String> map) {
		introductionMap = map;
	}

	public AbstractPrototype cloneMyself() {

		addSomeIntrouction("公司介绍", "这是公司基本介绍");
		AbstractPrototype object = new CompanyBaseIntroduction(introductionMap);

		return object;

	}

	public void addSomeIntrouction(String topic, String content) {
		introductionMap.put(topic, content);
	}

	public void deleteSomeIntrouction(String key) {

		if (introductionMap.containsKey(key)) {
			introductionMap.remove(key);
		}

	}

	public void addIntrouctionMap(Map map) {
		introductionMap.putAll(map);
	}

	public Map getIntroductionMap() {
		return introductionMap;
	}

	public void showIntrouction() {

		Iterator it = introductionMap.keySet().iterator();

		String key, value;

		while (it.hasNext()) {
			key = (String) it.next();
			value = (String) introductionMap.get(key);
			System.out.println("key: " + key + "; value: " + value);
		}

	}

}

原始模型测试程序的代码清单03如下:

程序代码清单03

public class Client {

	public static void main(String[] args) {

		CompanyBaseIntroduction company = new CompanyBaseIntroduction();

		AbstractPrototype departA = company.cloneMyself();
		departA.addSomeIntrouction("部门A介绍", "这是部门A介绍的内容");
		departA.showIntrouction();
		// company.showIntrouction();

		AbstractPrototype departB = departA.cloneMyself();
		departB.deleteSomeIntrouction("部门A介绍");
		departB.addSomeIntrouction("部门B介绍", "这是部门B介绍的内容");
		// departB.showIntrouction();
	}
}

原始模型测试类输出结果如下所示:

key: 部门A介绍; value: 这是部门A介绍的内容
key: 公司介绍; value: 这是公司基本介绍

4 扩展和说明

在java中已经在语言层次上支持了原始模型模式。在java语言所有的类的顶级父类都是java.lang.Object类。java.lang.Object类有一个clone()方法,该方法就是实现创建并返回此对象的一个副本。所以说,在java系统中没有专门去编写这个模式的应用,直接调用就能实现功能。不过在使用过程中,要注意。如果要让一个类提供克隆功能,该类必须实现java.lang.Cloneable接口,并重载java.lang.Object.clone()方法(虽然ava.lang.Cloneable接口是一个空的接口,没有申明任何属性与方法。)。该接口只是告诉JVM,该接口的实现类需要开放“克隆”功能。Java实现clone的例子见程序代码清单06。

程序代码清单06

public class A implements Cloneable {

	public Object clone() {
		try {
			return super.clone();
		} catch (CloneNotSupportedException e) {
			return null;
		}
	}
}

参考链接

5种创建型模式:

Gof23种设计模式(1)——工厂模式(Factory Method)
Gof23种设计模式(2)——抽象工厂模式(Abstract Factory)
Gof23种设计模式(3)——建造模式(Builder)
Gof23种设计模式(4)——原型模式(Prototype)
Gof23种设计模式(5)——单例模式(Singleton)
Gof23种设计模式 —— 创建型模式总结和比较

回到总目录Gof23种设计模式(全解析)

(转载自微信公众号:架构设计模式)

素课网
  • 本文由 发表于 2020年8月6日14:18:28
  • 转载请注明:https://www.suketech.com/8797.html
设计模式:面向对象设计的六大原则 - 总结 设计模式

设计模式:面向对象设计的六大原则 – 总结

开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统。开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们对扩展开放,对修改关闭,可是到底如何才能做到对扩展开放,对修...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: