Java23种设计模式-创建型模式之原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象生成新对象,而无需编写从头开始创建新对象的代码。

优点:可以克隆对象,无需与它们所属的具体类相耦合;可以克隆预生成原型,避免反复运行初始化代码;提高性能等。
缺点:克隆包含循环引用的复杂对象可能会非常麻烦;配备克隆方法需要对类的功能进行通盘考虑必须实现Cloneable接口
实现方式
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆不再指向原有对象地址

使用场景

1.类初始化需要消化非常多的资源,包括数据、硬件资源。

2.通过new产生一个对象需要非常繁琐的数据准备或访问权限。

3.一个对象多个修改者的场景。

工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,即"对象.clone( )"
示例:设置一个原型类MyObject 然后创建深拷贝类MyObjectDeepClone 和浅拷贝类MyObjectShallowClone 最后创建一个测试类Client 然后修改数据 打印查看即可知浅拷贝和深拷贝区别。

java 复制代码
//原型类
class MyObject {
    private int basicField;
    private List<String> objectField;

    public int getBasicField() {
        return basicField;
    }

    public void setBasicField(int basicField) {
        this.basicField = basicField;
    }

    public List<String> getObjectField() {
        return objectField;
    }

    public void setObjectField(List<String> objectField) {
        this.objectField = objectField;
    }

    public MyObject(int basicField, List<String> objectField) {
        this.basicField = basicField;
        this.objectField = new ArrayList<>(objectField);
    }
    @Override
    public String toString() {
        return "MyObject{" +
                "basicField=" + basicField +
                ", objectField=" + objectField +
                '}';
    }
}

//深拷贝
class MyObjectDeepClone {
    private MyObject innerObject;

    public MyObjectDeepClone(MyObject innerObject) {
        this.innerObject = new MyObject(innerObject.getBasicField(), new ArrayList<>(innerObject.getObjectField()));
    }

    public MyObjectDeepClone deepClone() {
        return new MyObjectDeepClone(new MyObject(innerObject.getBasicField(), new ArrayList<>(innerObject.getObjectField())));
    }

    @Override
    public String toString() {
        return "MyObjectDeepClone{" +
                "innerObject=" + innerObject +
                '}';
    }
}
//浅拷贝
class MyObjectShallowClone implements Cloneable {
    private MyObject innerObject;

    public MyObjectShallowClone(MyObject innerObject) {
        this.innerObject = innerObject;
    }

    public MyObjectShallowClone clone() {
        try {
            return (MyObjectShallowClone) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new Error("This shouldn't happen", e);
        }
    }

    @Override
    public String toString() {
        return "MyObjectShallowClone{" +
                "innerObject=" + innerObject +
                '}';
    }
}
//验证测试
public class Client {
    public static void main(String[] args) throws Exception {
        List<String> objectField =new ArrayList<>();
        objectField.add("aaaa");
         //原始类
        MyObject myObject=new MyObject(1,objectField);
		//深拷贝
        MyObjectDeepClone myObjectDeepClone = new MyObjectDeepClone(myObject);
        //浅拷贝
        MyObjectShallowClone myObjectShallowClone=new MyObjectShallowClone(myObject);
        //深拷贝打印
		System.out.println(myObjectDeepClone);
		//MyObjectDeepClone{innerObject=MyObject{basicField=1, objectField=[aaaa]}}
		//浅拷贝
        System.out.println(myObjectShallowClone);
		//MyObjectShallowClone{innerObject=MyObject{basicField=1, objectField=[aaaa]}}
		//修改原始数据
        objectField.add("ssss");
        myObject.setObjectField(objectField);
        
       	//打印判断是否变化,输出发生变化的为浅拷贝
        System.out.println(myObjectShallowClone);
        //MyObjectShallowClone{innerObject=MyObject{basicField=1, objectField=[aaaa, ssss]}}
        System.out.println(myObjectDeepClone);
        //MyObjectDeepClone{innerObject=MyObject{basicField=1, objectField=[aaaa]}}

    }
}
相关推荐
AI人工智能+电脑小能手6 小时前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用
leeyi9 小时前
两个 Agent 怎么协作:Host-Worker 模式(第91篇-E77)
设计模式·agent·ai编程
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
星火10241 天前
【Groovy翻译-进阶篇】Groovy 中的设计模式
后端·设计模式·groovy
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-27-策略模式(源码剖析篇)
java·spring·设计模式·策略模式·源码分析·事务管理·comparator
SL_staff1 天前
风控规则如何从硬编码解耦?我们在 JVS-Rules 中的实践与思考
java·spring boot·设计模式
小此方1 天前
Linux加餐(一):藏在Linux中的设计模式(一)策略模式与日志
linux·设计模式·策略模式
To_OC2 天前
从一行入口代码啃透 NestJS:工厂模式、装饰器和依赖注入是怎么串起来的
后端·设计模式·nestjs
东方小月2 天前
从零开发一个 Coding Agent(十二):实现版本化 JSONL 与真实 CLI 入口
前端·设计模式·前端框架
程序员贺加贝2 天前
轻制造SaaS的生产闭环建模-BOM工单领料报工质检与入库
java·设计模式·架构