移动端访问不佳,请访问我的个人博客

设计模式学习的demo地址,欢迎大家学习交流

原型模式

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

定义

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。

原型模式的基本实现

上图是最基本的原型模式的结构图,下面将用Swift代码来实现一个基本原型模式:

// 定义一个原型协议
protocol Prototype {
    var id: String { get }
    func clone() -> Prototype
}

// 原型的具体对象
class ConcretePrototypeA: Prototype {
    var id: String = ""
    // 实现克隆的具体操作
    func clone() -> Prototype {
        let p = ConcretePrototypeA()
        p.id = id
        return p
    }
}

不知道大家有没哟发现,这个设计模式我们在代码中经常会用到,那就是NSCopying协议,通过这个协议来实现对象的深拷贝,下面我们就用NSCopying来实现一下。

原型模式解决实际问题(NSCopying)

import Foundation

class Resume: NSCopying {

    var name: String
    var sex: String
    var age: String
    var company: String

    init(name: String, sex: String, age: String, company: String) {
        self.name = name
        self.sex = sex
        self.age = age
        self.company = company
    }

    func disPlay() {
        print("name: \(name), sex: \(sex), age: \(age), company: \(company)")
    }

    func copy(with zone: NSZone? = nil) -> Any {
        return Resume(name: name, sex: sex, age: age, company: company)
    }
}

上面是通过NSCopying来实现原型模式的例子,一下是使用过程:

let wcl = Resume(name: "wcl", sex: "male", age: "23", company: "beijing")
let scy = wcl.copy() as! Resume
scy.name = "scy"
scy.sex = "female"
wcl.disPlay()
scy.disPlay()

以下是打印的结果:

name: wcl, sex: male, age: 23, company: beijing
name: scy, sex: female, age: 23, company: beijing

以上是我对于原型模式的理解,如果有不对的地方欢迎大家交流,最后谢谢大家的阅读~~

swift设计模式学习 - 原型模式的更多相关文章

  1. swift设计模式学习 - 代理模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 代理模式 代理模式为其他对象提供一种代理以控制对这个对象的访问,在某些情况下,一个对象不适合或者不能直接引用另一个对象 ...

  2. swift设计模式学习 - 策略模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 策略模式 策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. ...

  3. swift设计模式学习 - 模板方法模式

    移动端访问不佳,请访问我的个人博客 设计模式学习的demo地址,欢迎大家学习交流 模板方法模式 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结 ...

  4. (@WhiteTaken)设计模式学习——原型模式

    有这样一个需求,两个对象,只是名称以及其他几个属性不一样,而其他的大部分的属性都是相同的. 这时候我们可以用到原型模式,也就是克隆模式. 原型模式:原型模式是一个对象创建型模式,通过克隆原对象,可以使 ...

  5. C#设计模式之六原型模式(Prototype)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  6. C#设计模式之五原型模式(Prototype Pattern)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  7. C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone

    C#设计模式(6)——原型模式(Prototype Pattern)   一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...

  8. C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone

    C# Json反序列化   Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...

  9. java设计模式4——原型模式

    java设计模式4--原型模式 1.写在前面 本节内容与C++语言的复制构造函数.浅拷贝.深拷贝极为相似,因此建议学习者可以先了解C++的该部分的相关知识,或者学习完本节内容后,也去了解C++的相应内 ...

随机推荐

  1. 【JMeter】如何用JMeter进行压力测试

    [JMeter]如何用JMeter进行压力测试(调试脚本已再猪猪微信的收藏中进行了收藏哦,名字叫exam-wow.jmx) 一.用badboy录制压测过程形成脚本另存为jmeter格式文档. 二.JM ...

  2. sql批量修改wordpress网站的文章发布状态

    wordpress批量导入文章的时候,有些文章的状态可能会缺失,例如“mis scheduled”.draft.future等几种状态,如何用sql批量修改wordpress网站的文章发布状态呢? 点 ...

  3. spring boot 中用@value给static变量赋值

    需求:改写一个JedisUtils,工具类,所以最好用静态方法和变量. @value("${redis.host}") private static String redisHos ...

  4. 使用LinkedList模拟栈数据结构的集合

    封装MyStack类 public class MyStack { private LinkedList link; //调用MyStack创建对象的时候其实是调用的LinkedList创建的是Lin ...

  5. window下安装mongodb3.6

    系统:Win10 x64位 1.在官网下载对应的mongod https://www.mongodb.com/download-center?jmp=nav#community 2.下载后在win+R ...

  6. 项目发布脚本-go

    #!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin clear printf &q ...

  7. [LeetCode] 345. Reverse Vowels of a String_Easy tag:Two Pointers

    Write a function that takes a string as input and reverse only the vowels of a string. Example 1: In ...

  8. matlab中的containers.Map()

    matlab中的containers.Map() 标签: matlabcontainers.Map容器map 2015-10-27 12:45 1517人阅读 评论(1) 收藏 举报  分类: Mat ...

  9. distinct count

    实验:查询一个column的无重复记录,需要知道有多少条记录,并显示记录. 统计记录用count(*)函数,无重复记录distinct,以emp表为例. (1)先查询无重复记录 [@more@] SQ ...

  10. .NET 和 .NET框架概览

    什么是.NET .NET是为简化在第三代因特网的分布式环境下的应用程序的开发,基于开放互联网标准和协议之上,实现异质语言和平台高度交互性而构建的新一代计算和通信平台.其主要由三部分构成:.NET框架. ...