文档章节

原型模式

阿元
 阿元
发布于 2018/10/23 01:28
字数 1178
阅读 68
收藏 0

1、原型模式-定义

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 克隆(浅度克隆->拷贝值类型或者引用,深度克隆->创建新的对象,开辟新的内存)

例如客户端知道抽象Prototype类,在运行时,抽象Prototype子类的任何对象都可以按客户端的意愿被复制。因此,无需手工创建就可以制造同一类型的多个实例。可以简单理解为创建第一个模版对象,然后通过复制(深拷贝)模版来创建新的对象。 从功能的角度看,不管什么对象,只要复制自身比手工实例化要好,都可以是原型对象。

2、原型模式-应用场景

1.需要创建的对象应独立于其类型与创建方式。是说想要创建的对象不能直接通过初始化函数来创建,创建方式不具有普遍性,比较复杂。 2.要实例化的类是在运行时决定的。是说在编写代码时,并不知道哪种对象会被创建,取决于用户的操作,且内部结构复杂。 3.不想要与产品层次相对应的工厂层次。是说不通过工厂方法或抽象工厂来控制产品的创建过程。 4.不用类的实例间的差异仅是状态的若干组合。因此复制相应数量的原型比手工实例化更加方便。 5.类不容易创建,比如每个组件可把其他组件作为子节点的组合对象。复制已有的组合对象并对副本进行修改会更加容易。

两种特别常见的情形: 1.有很多相关的类,其行为略有不同,,而且主要差异在于内部属性,如名称、图像。 2.需要使用组合(树型)对象作为其他东西的基础,例如,使用组合对象作为组建来构建另一个组件对象。

场景一:当我们编写组件需要创建新的实例对象,但是又不想依赖类的初始化构造器的时候可以采用原型模式来设计。 场景二:类的初始化过程中需要消耗非常多的资源(数据、硬件资源等),可以采用原型模式设计

3、原型模式-角色划分

	两个核心角色?
	角色一:克隆接口
	角色二:具体实现类
		特点:实现协议

4、原型模式-原理案例

数据库框架涉及克隆模式(设计框架应用)

案例一:浅度拷贝->浅度克隆

[@interface](https://my.oschina.net/u/996807) Test()

[@property](https://my.oschina.net/property) (nonatomic, strong) NSString *strStrong;
[@property](https://my.oschina.net/property) (nonatomic, copy) NSString *strCopy;

[@end](https://my.oschina.net/u/567204)

NSMutableString *string = [NSMutableString stringWithFormat:@"abc"];
	self.strStrong = string;
	self.strCopy = string;
	NSLog(@"旧strStrong: %@", self.strStrong);
	NSLog(@"旧strCopy: %@", self.strCopy);
	
	[string appendFormat:@"def"];
	NSLog(@"新strStrong: %@", self.strStrong);//浅拷贝
	NSLog(@"新strCopy: %@", self.strCopy);
	
	/* 打印
	旧strStrong: abc
旧strCopy: abc
新strStrong: abcdef
新strCopy: abc
	*/

案例二:深度拷贝->自定义协议

	class ValueModel: CloneableProtocol {

    var name:String
    var sex:String
    
    init(name:String, sex:String) {
        self.name = name
        self.sex = sex
    }
    
    func clone() -> ValueModel {
        return ValueModel(name: self.name, sex: self.sex)
    }
}

class WorldDocument: CloneableProtocol {

    var name:String
    var content:String
    var value:ValueModel
    
    
    init(name:String, content:String, value:ValueModel) {
        self.name = name
        self.content = content
        self.value = value
    }
    
    func clone() -> WorldDocument {
        return WorldDocument(name: self.name, content: self.content, value: self.value.clone())
    }
    
}

案例三:Cocoa Touch框架的对象复制 系统NSCopying协议

class NSLog: NSCopying {

    var name:String
    var sex:String
    
 	 required init(name:String, sex:String) {
        self.name = name
        self.sex = sex
    }
	
    func copy(with zone: NSZone? = nil) -> Any {
   		 let tmp = type(of: self).init()
			 tmp.name = self.name
			 tmp.sex = self.sex
        return tmp
    }
}

浅复制与深复制

深拷贝就是内容拷贝,浅拷贝就是指针拷贝。

  • 浅拷贝:是内存地址拷贝,即是目标对象 拷贝的是源对象的 内存地址,因此两个对象指向同一片内存,里面的内容是一样的,不管修改谁的内容,另一个都会跟着变化。 swift中类 class 是浅拷贝 ,引用拷贝
  • 深拷贝:是源对象内容的拷贝,内存空间是自主分配的,目标对象 和 源对象 指向的不是同一片内存。虽然里面的内容一样,但是修改了一个对象的内容,另一个不会跟着变化。swift中类struct 是深拷贝 ,值拷贝 。 https://blog.csdn.net/CHENYUFENG1991/article/details/51771728, http://ios.jobbole.com/84581/, https://www.ctolib.com/topics-117445.html

© 著作权归作者所有

共有 人打赏支持
上一篇: 太极LOGO
下一篇: 模板模式
阿元
粉丝 5
博文 163
码字总数 109721
作品 0
浦东
程序员
私信 提问
JavaScript高级程序设计02

面向对象 重点:原型 创建对象 Javascript中没有类的概念,对象是属性的集合,可以想象成成散列表。 对象实例 创建object实例,为它添加方法 对象字面量 其实就是创建object实例的简写形式 ...

白发道长
2018/01/02
0
0
【设计模式】原型模式 Pototype Parttern

前面讲了创建一个对象实例的方法单例模式Singleton Parttern, 创造多个产品的工厂模式(简单工厂模式 Simple Factory Pattern, 工厂方法模式 FactoryMothed Parttern,抽象工厂模式 Abstra...

风之源
2018/08/06
0
0
java23种设计模式十四(连载)

十四、原型模式 原型模式属于对象的创建模式,它要求对象可以“克隆”自身,从而可以复制本身的对象来创建一个实例。通过原型创建的对象,不需要关心这个实例本身,只要实现了克隆方法,就可...

lynnlovemin
2017/08/31
0
0
炒冷饭系列:设计模式 原型模式

炒冷饭系列:设计模式 原型模式 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 亲爱我,孝何难;亲恶我,孝方贤。 一、什么是原型模式 Prot...

泥沙砖瓦浆木匠
2014/07/28
0
0
深入理解原型模式 ——通过复制生成实例

Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guide一 原型模式介绍 在面向对象系统中,使用原型模式来复制一个对象自...

Amsour丶
2018/06/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linux-tao
41分钟前
0
0
乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxprobe16
今天
9
0
OSChina 周日乱弹 —— 没时间 没头发 但有钱

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @开源中国总经办主任 :分享齐一的单曲《这个年纪》 《这个年纪》- 齐一 手机党少年们想听歌,请使劲儿戳(这里) @肿肿卷 :我真的可以睡一天...

小小编辑
今天
90
6
Django进阶 1.1 ORM基础—ORM 1.2.1 增删改查之查询 1.2.2 删改增 (1) 1.2.3 删改增 (2)

ORM基础 ORM是Django操作数据库的API,Django的作者将sql语句封装在里面供我们使用。 我们前面还提到过Django提供一个模拟数据库的工具,sqlite,供我们学习测试使用。 如果我们想使用mysql...

隐匿的蚂蚁
今天
3
0
Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部