9.原型模式(大话设计模式kotlin版)

原型模式

定义

原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝(克隆clone)这些原型创建新的对象。核心思想:通过克隆对象来隐藏对象的创建细节。

克隆的步骤

  • 原型对象实现Cloneable接口
  • 调用对象的clone()方法实现对象的克隆

UML图

原型模式的结构图

基本实现代码

Prototype:原型类

/**
 * @create on 2020/8/23 16:16
 * @description 原型类
 * @author mrdonkey
 */
abstract class Prototype(var name: String, var list: ArrayList<String>) : Cloneable {
    /**
     * 提供克隆对象的方法
     */
    abstract fun cloneObj(): Prototype

    override fun toString(): String {
        return "Prototype(name='$name',nameHashCode=${name.hashCode()}, list=$list , listHashCode=${list.hashCode()})"
    }

}

ConcretePrototype1:具体的原型类1

/**
 * @create on 2020/8/23 16:17
 * @description 具体原型类1
 * @author mrdonkey
 */
class ConcretePrototype1(name: String, list: ArrayList<String>) : Prototype(name, list) {
    override fun cloneObj(): Prototype {
        return this.clone() as Prototype
    }
}

Client:客户端类

/**
 * @create on 2020/8/23 16:17
 * @description 客户端类
 * @author mrdonkey
 */
class Client {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            val obj = ConcretePrototype1("tom", arrayListOf("1", "2", "3"))
            val cloneObj = obj.cloneObj()
            //克隆对象修改name
            println("----克隆对象修改name----")
            cloneObj.name = "jeny"
            println("obj-->$obj")
            println("cloneObj-->$cloneObj")
            //克隆对象更改list
            println("----克隆对象更改list----")
            cloneObj.list.add("4")
            println("obj-->$obj")
            println("cloneObj-->$cloneObj")
        }
    }
}

输出

----克隆对象修改name----
obj-->Prototype(name='tom',nameHashCode=115026, list=[1, 2, 3] , listHashCode=78481)
cloneObj-->Prototype(name='jeny',nameHashCode=3258438, list=[1, 2, 3] , listHashCode=78481)
----克隆对象更改list----
obj-->Prototype(name='tom',nameHashCode=115026, list=[1, 2, 3, 4] , listHashCode=2432963)
cloneObj-->Prototype(name='jeny',nameHashCode=3258438, list=[1, 2, 3, 4] , listHashCode=2432963)

浅复制与深复制

  • 浅复制:被复制的对象的所有基本类型变量都含有与原来的对象相同的值,而所有的引用对象的引用都指向原来的对象。
  • 深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

在上面的程序输出中:我们可以看到被克隆后的对象cloneObj改变name不会影响原来的对象的name,但是改变了list则导致原来的list也发生了改变,这是由于系统自带的clone方法只实现浅复制;需要实现对象深复制,则得重写clone方法,并在方法中手动创建一个新的list赋值给cloneObj实现引用类型对象的赋值。注:String是一种特殊的引用类型,修改就会新建一个string实例,通过输出可以看出修改前后的hashCode不同 。

原型模式的优缺点

这里指系统自带的clone方法的优缺点

  • 优点:隐藏了对象创建的细节。
  • 缺点:深复制需要手动实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值