设计模式-原型模式

设计模式-原型模式

一、什么是原型模式?

面试场景模拟

面试官: 你知道那些Spring的设计模式?

面试者: 工厂模式、原型模式、单例模式等等..

面试官: 小伙子不错,那你讲讲原型模式吧,毕竟这个实际生产我们用的很多。

面试者(心想): 有毒,不安常理出牌,这么简单有什么讲的....。 面试者: 让我想想..

基于面向“面试”编程,今天就让我们了解以下原型模式吧。

1.1 介绍

原型模式是一种创建型设计模式,能够复制已有对象, 而又无需使代码依赖它们所属的类。使用这种方式创建新的对象,无需再通过 new 实例化来创建对象了。因为 Object 类的 clone 方法是一个本地方法,它可以直接操作内存中的二进制流,这也是它性能比较new更好的原因。

二、优缺点

2.1 优点

  • 克隆对象, 而无需与它们所属的具体类相耦合。

  • 克隆预生成原型, 避免反复运行初始化代码。

  • 更方便地生成复杂对象。

  • 用继承以外的方式来处理复杂对象的不同配置。

2.2 缺点

  • 克隆包含循环引用的复杂对象可能会非常麻烦。

三、解决方案

实现原型的三个条件:

1.实现 Cloneable 接口:该接口会告诉虚拟机可以安全的实现该类的clone方法。在JVM中,只有实现了Cloneable接口的类才可以被拷贝,或者抛出CloneNotSupportedException异常。

2.重写 Object 的 clone 方法:Java中所有类的父类都是Object类,而Object类中有一个clone方法,可以返回一个对象的一个拷贝。

3.在重写的 clone 方法中调用 super.clone():默认情况下,类不具备复制对象的能力,需要调用 super.clone() 来实现。

原型模式的主要特征就是使用clone方法复制一个对象。通常,有些人会误以为 Object a = new Object();Object b = a;这种形式就是一个复制过程,但是其只是复制对象引用,也就是a和b对象指向的是同一个内存地址,如果修改b的值,a也会跟着修改。

 

四、适用场景

  • 如果需要复制一些对象, 同时又希望代码独立于这些对象所属的具体类, 可以使用原型模式。

  • 如果子类的区别仅在于其对象的初始化方式, 那么可以使用该模式来减少子类的数量。 别人创建这些子类的目的可能是为了创建特定类型的对象。


 

五、代码实现

   class Prototype implements Cloneable {
        //重写clone方法
        public Prototype clone(){
            Prototype prototype = null;
            try{
                prototype = (Prototype)super.clone();
            }catch(CloneNotSupportedException e){
                e.printStackTrace();
            }
            return prototype;
        }
    }
​
    //实现原型类
    class ConcretePrototype extends Prototype{
        public void show(){
            System.out.println("实现原型模式类");
        }
    }
​
    public class Client {
        public static void main(String[] args){
            ConcretePrototype cp = new ConcretePrototype();
            for(int i=0; i< 10; i++){
                ConcretePrototype clonecp = (ConcretePrototype)cp.clone();
                clonecp.show();
            }
        }
    }

六、参考引用

  1. 《Design Patterns》 亚历山大·什韦茨(Alexander Shvets)深入理解设计模式 一书

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值