设计模式——原型模式

场景模式

在现在的工厂生产中,我们生产的产品都是大同小异的。即基本上都是相同的。在这种情况下,如果每次生产一个产品都要我们自己手动的去输入参数,相当于自己去new一个,那么就会显得很麻烦。那么我们想到的最好的办法就是用克隆的办法去从一个对象生成另一个和此对象相同的对象。原型模式就是我们说到的克隆。即根据一个对象生成一个与此对象一摸一样的对象。

注:因为java中是存在实现原型模式的接口的,即Cloneable。如果有些语言没有,就是一个接口,里面有一个抽象的clone方法。但是在java中cloneable是标记接口,因为里面其实是没有抽象方法

代码实现

Configuration class

public class Configuration {
    int memory;
    String CPU;

    public Configuration(int memory, String CPU) {
        this.memory = memory;
        this.CPU = CPU;
    }

    public int getMemory() {
        return memory;
    }

    public String getCPU() {
        return CPU;
    }

    public void setMemory(int memory) {
        this.memory = memory;
    }

    public void setCPU(String CPU) {
        this.CPU = CPU;
    }

    @Override
    public String toString() {
        return "Configuration{" +
                "memory=" + memory +
                ", CPU='" + CPU + '\'' +
                '}';
    }
}

MacPro

public class MacPro implements Cloneable{
    int size;
    String model;
    Configuration configuration;

    public MacPro(int size, String model, Configuration configuration) {
        this.size = size;
        this.model = model;
        this.configuration = configuration;
    }

    public int getSize() {
        return size;
    }

    public String getModel() {
        return model;
    }

    public Configuration getConfiguration() {
        return configuration;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public void setConfiguration(Configuration configuration) {
        this.configuration = configuration;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Test

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Configuration configuration = new Configuration(1024,"i9");
        MacPro macPro = new MacPro(16,"macBook Pro",configuration);
        MacPro clonemacPro = (MacPro)macPro.clone();
        System.out.println(clonemacPro == clonemacPro);
        System.out.println(clonemacPro.getModel()+"   "+clonemacPro.getSize()+"   "+clonemacPro.getConfiguration());

        System.out.println("以下是测试浅拷贝和深拷贝,和原型模式已经没啥关系了");
        clonemacPro.setModel("mac Air");
        clonemacPro.setSize(13);
        configuration.setCPU("i7");
        clonemacPro.setConfiguration(configuration);
        System.out.println(macPro.getModel()+"  "+macPro.getSize()+"   "+macPro.getConfiguration());
    }
}

写在最后

注意深克隆和浅克隆问题。这个问题的但是其实是因为数据是基本类型还是引用类型类型造成的。引用类型复制的是引用值。但是在JAVA中又要主要String类型。虽然其是引用类型,但是却存在常量池中。这里就是提一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值