创建型模式-原型模式

原型模式是用于创建重复的对象,同时又能保证性能,这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象的代价比较大时,则采用这种模式

**意图:**用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

**主要解决:**在运行期建立和删除原型。

何时使用: 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。 3、为了避免创建一个与产品类层次平行的工厂类层次时。 4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

**如何解决:**利用已有的一个原型对象,快速地生成和原型对象一样的实例。

关键代码: 1、实现克隆操作,在 JAVA 实现 Cloneable 接口,重写 clone(),在 .NET 中可以使用 Object 类的 MemberwiseClone() 方法来实现对象的浅拷贝或通过序列化的方式来实现深拷贝。 2、原型模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些"易变类"拥有稳定的接口。

应用实例: 1、细胞分裂。 2、JAVA 中的 Object clone() 方法。

优点: 1、性能提高。 2、逃避构造函数的约束。

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

使用场景: 1、资源优化场景。 2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。 3、性能和安全要求的场景。 4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。 5、一个对象多个修改者的场景。 6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。 7、在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用。

**注意事项:**与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。

java 复制代码
public abstract class Shape implements Cloneable{

    private String id;
    private String type;

    abstract void draw();

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
java 复制代码
public class Circle extends Shape{
    private String id;
    private String type;


    @Override
    void draw() {
        System.out.println("this is Circle");
    }
}
java 复制代码
public class Rectangle extends Shape {



    private String id;
    private String type;

    @Override
    void draw() {
        System.out.println("this is Rectangle ");
    }
}
java 复制代码
@Data
public class Square extends Shape{

    private String id;
    private String type;



    @Override
    void draw() {
        System.out.println("this is Square");
    }
}
java 复制代码
public class ShapeCache {
    private static final HashMap<String,Shape> shapeHashMap  = new HashMap<String,Shape>();
    public static Shape getShape(String shapeId) throws CloneNotSupportedException {
        Shape shape = shapeHashMap.get(shapeId);
        return (Shape) shape.clone();
    }

    public static void loadCache() {
        Circle circle = new Circle();
        circle.setId("1");
        circle.setType("circle");
        shapeHashMap.put(circle.getId(),circle);

        Square square = new Square();
        square.setId("2");
        square.setType("square");
        shapeHashMap.put(square.getId(),square);

        Rectangle rectangle = new Rectangle();
        rectangle.setId("3");
        rectangle.setType("rectangle");
        shapeHashMap.put(rectangle.getId(),rectangle);
    }

}
java 复制代码
   @Test
    public void test12() throws CloneNotSupportedException {
        ShapeCache.loadCache();
        designPattern.yaunxingmoshi.Shape shape = ShapeCache.getShape("1");
        System.out.println(shape.getType());

        designPattern.yaunxingmoshi.Shape shape2 = ShapeCache.getShape("2");
        System.out.println(shape2.getType());

         designPattern.yaunxingmoshi.Shape shape3 = ShapeCache.getShape("3");
        System.out.println(shape3.getType());

    }
/*

circle
square
rectangle



*/
相关推荐
渣哥1 小时前
原来 Java 里线程安全集合有这么多种
java
间彧1 小时前
Spring Boot集成Spring Security完整指南
java
间彧1 小时前
Spring Secutiy基本原理及工作流程
java
数据智能老司机2 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
Java水解2 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
数据智能老司机3 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
洛小豆4 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学5 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole5 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊5 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端