设计模式【原型模式】

发布于 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 接口

  • 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候

应用

  •  使用场景:

    1. 资源优化场景,类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等

    2. 性能和安全要求的场景,通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式

    3. 一个对象多个修改者的场景,一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用

    4. 在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 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 {    @Override    public Object clone() {        Circle c = null;        try {            c = (Circle) super.clone();        } catch (CloneNotSupportedException e) {            System.out.println("拷贝圆面积失败!");        }        return c;    }    @Override    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 {    @Override    public Object clone() {        Square s = null;        try {            s = (Square) super.clone();        } catch (CloneNotSupportedException e) {            System.out.println("计算正方形面积失败");        }        return s;    }    @Override    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 我们将第一时间删除。

相关素材