设计模式【原型模式】
发布于 2021-01-03 14:27
定义与特点
定义:Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.(用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象)
类图:
原型模式涉及3个角色
客户(Client):该角色提出创建对象的请求
抽象原型(Prototype):该角色是一个抽象角色,通常由一个Java接口或抽象类实现,给出所有的具体原型类所需的接口
具体原型(Concrete Prototype):该角色是被复制的对象,必须实现抽象原型接口
优点
性能优良:原型模式是在内存二进制流的复制,要比直接new一个对象性能好,特别是在一个循环体内产生大量的对象时,原型模式可以更好的体现其优点。
逃避构造函数的约束:这既是优点也是缺点,直接在内存中复制,构造函数是不会执行的,因此减少了约束,需要在实际应用时进行权衡考虑。
缺点
必须实现 Cloneable 接口
配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候
应用
使用场景:
资源优化场景,类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等
性能和安全要求的场景,通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式
一个对象多个修改者的场景,一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用
在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用
实现
package javan.design.demo02prototype;
import java.util.HashMap;
import java.util.Scanner;
/**
* @Descrition: 用带原型管理器的原型模式来生成包含“圆”和“正方形”等图形的原型,并计算其面积。
* @Author Javan
* @Date 2021.01.03
* @Version V1.0
*/
interface Shape extends Cloneable {
public Object clone(); //拷贝
public void countArea(); //计算面积
}
class Circle implements Shape {
public Object clone() {
Circle c = null;
try {
c = (Circle) super.clone();
} catch (CloneNotSupportedException e) {
System.out.println("拷贝圆面积失败!");
}
return c;
}
public void countArea() {
int r = 0;
System.out.println("这是一个圆,请输入圆的半径:");
Scanner input = new Scanner(System.in);
r = input.nextInt();
System.out.println("该圆的面积:" + 3.1415926 * r * r + "\n");
}
}
class Square implements Shape {
public Object clone() {
Square s = null;
try {
s = (Square) super.clone();
} catch (CloneNotSupportedException e) {
System.out.println("计算正方形面积失败");
}
return s;
}
public void countArea() {
int a = 0;
System.out.println("这是一个正方形,请输入边长:");
Scanner input = new Scanner(System.in);
a = input.nextInt();
System.out.println("该正方形的面积:" + a * a + "\n");
}
}
class PrototypeManager {
private HashMap<String, Shape> ht = new HashMap<>();
public PrototypeManager() {
ht.put("Circle", new Circle());
ht.put("Square", new Square());
}
public void addShape(String key, Shape obj) {
ht.put(key, obj);
}
public Shape getShape(String key) {
Shape temp = ht.get(key);
return (Shape) temp.clone();
}
}
public class PrototypeShape {
public static void main(String[] args) {
PrototypeManager pm = new PrototypeManager();
Shape obj1 = pm.getShape("Circle");
obj1.countArea();
Shape obj2 = pm.getShape("Square");
obj2.countArea();
}
}
运行结果:
WebSphere 安装部署
《肖申克的救赎》观后感
学会这些EXCEL公式让工作效率提高一大截
项目经理90%以上的时间都在沟通
项目经理和成员发生冲突怎么办?
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材