文档章节

原型模式

阿元
 阿元
发布于 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
码字总数 108363
作品 0
浦东
程序员
私信 提问
深入理解原型模式 ——通过复制生成实例

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

Amsour丶
06/19
0
0
JavaScript高级程序设计02

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

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

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

风之源
08/06
0
0
《JavaScript高级程序设计》学习总结(2)-创建对象的模式

前天就在看面象对象设计这一章了,可是总是迷迷糊糊,今天又看了一遍,又看了云课堂里面的关于js的视频,才是真的对创建对象有了一点理解;现在对这一节做一个总结。创建对象的方法在这本书中...

hyz000
2016/03/31
45
0
23种设计模式(5):原型模式

定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 类型:创建类模式 类图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具...

LCZ777
2014/07/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day150-2018-11-17-英语流利阅读-待学习

歪果仁也疯狂:海外版抖音的征途 毛西 2018-11-17 1.今日导读 海外版抖音 TikTok 于 2017 年 5 月上线海外,至今覆盖全球 150 多个国家和地区,月活跃用户数已突破 5 亿。然而,“出海”的抖...

飞鱼说编程
今天
10
0
分布式学习最佳实践:从分布式系统的特征开始(附思维导图)

什么是分布式系统 回到顶部   分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的、普通的机器完成单个计算机无法...

dragon_tech
今天
4
0
TOKEN设计

TOKEN设计 Api_Token 首先需要知道API是什么? API(Application Programming Interface)即应用程序接口。你可以认为 API 是一个软件组件或是一个 Web 服务与外界进行的交互的接口。而我们在...

DrChenXX
今天
3
0
浅谈“李氏代换”——从纪念金庸和斯坦李说起

李氏代换(LSP)简介 李氏代换是软件设计的一个原则,又名依赖倒转原则或依赖倒置原则,其衍生原则有接口分离原则等。该原则由Barbara Liskov于1988年提出。 该原则指出,程序中高级别的元素...

SamYjy
今天
36
0
JavaScript实现在线websocket WSS测试工具 -toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。T...

toolfk
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部