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]}}

    }
}
相关推荐
程序员与背包客_CoderZ9 小时前
C++设计模式——Abstract Factory Pattern抽象工厂模式
c语言·开发语言·c++·设计模式·抽象工厂模式
zzzhpzhpzzz9 小时前
设计模式——组合实体模式
设计模式
zzzhpzhpzzz12 小时前
设计模式——前端控制器模式
设计模式
forestsea13 小时前
【Java 解释器模式】实现高扩展性的医学专家诊断规则引擎
java·人工智能·设计模式·解释器模式
小白不太白95015 小时前
设计模式之 命令模式
设计模式·命令模式
吃汉堡吃到饱15 小时前
【创建型设计模式】单例模式
单例模式·设计模式
小白不太白95015 小时前
设计模式之 备忘录模式
服务器·设计模式·备忘录模式
zzzhpzhpzzz15 小时前
设计模式——策略模式
设计模式·策略模式
入门到跑路15 小时前
【君正T31开发记录】8.了解rtsp协议及设计模式
网络协议·设计模式
小白不太白95015 小时前
设计模式之 解释器模式
java·设计模式·解释器模式