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

    }
}
相关推荐
自在如风。6 小时前
Java 设计模式:策略模式详解
java·设计模式·策略模式
Koma-forever7 小时前
java设计模式-原型模式
java·设计模式·原型模式
吴八月7 小时前
设计模式:原型
设计模式
程序员JerrySUN9 小时前
设计模式 Day 6:深入讲透观察者模式(真实场景 + 回调机制 + 高级理解)
java·观察者模式·设计模式
自在如风。9 小时前
Java 设计模式:观察者模式详解
java·观察者模式·设计模式
魔道不误砍柴功10 小时前
使用 Function 来编写策略模式:优雅而高效的设计模式实践
设计模式·策略模式
-权子-11 小时前
设计模式 - 策略模式Strategy
设计模式·策略模式
Niuguangshuo11 小时前
Python设计模式:策略模式
python·设计模式·策略模式
搞不懂语言的程序员16 小时前
中介者模式详解及真实场景解决方案
设计模式·中介者模式
Koma-forever1 天前
java设计模式-单例模式
java·单例模式·设计模式