Swift设计模式之抽象工厂模式_swift抽象方法-程序员宅基地

技术标签: 设计模式  swift  

转自

原文

// 抽象工厂模式
// 百度百科:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类
// 设计模式分类:创建型模式

import Foundation

/**
 *  抽象工厂
 */
protocol Decimal {
    func stringValue() -> String
    // 工厂方法
    static func make(string : String) -> Decimal
}

typealias NumberFactory = (String) -> Decimal

// Number implementations with factory methods
/**
 *  具体工厂
 */
struct NextStepNumber : Decimal {
    private var nextStepNumber : NSNumber

    func stringValue() -> String { return nextStepNumber.stringValue }

    // 工厂方法
    static func make(string : String) -> Decimal {
        return NextStepNumber(nextStepNumber:NSNumber(longLong:(string as NSString).longLongValue))
    }
}

/**
 *  具体工厂
 */
struct SwiftNumber : Decimal {
    private var swiftInt : Int

    func stringValue() -> String { return "\(swiftInt)" }

    // 工厂方法
    static func make(string : String) -> Decimal {
        return SwiftNumber(swiftInt:(string as NSString).integerValue)
    }
}

enum NumberType {
    case NextStep, Swift
}

enum NumberHelper {
    static func factoryFor(type : NumberType) -> NumberFactory {
        switch type {
        case .NextStep:
            return NextStepNumber.make
        case .Swift:
            return SwiftNumber.make
        }
    }
}

let factoryOne = NumberHelper.factoryFor(.NextStep)
let numberOne = factoryOne("1")
numberOne.stringValue()

let factoryTwo = NumberHelper.factoryFor(.Swift)
let numberTwo = factoryTwo("2")
numberTwo.stringValue()
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aotian16/article/details/51382824

智能推荐

【linux】你需要以 root 身份执行此命令_您需要 root 权限执行此命令。-程序员宅基地

文章浏览阅读1.5w次,点赞16次,收藏72次。1、设置root用户的密码:sudo passwd root2、切换到root用户权限su3、切换回个人用户权限exit_您需要 root 权限执行此命令。

使用ESP8266,基于Alios things 的linkkit连接阿里生活物联网平台,实现天猫精灵控制_aliosthings不支持8266了-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏16次。1.写在前面我使用的模块是ESP-12F,理论上使用8266的WIFI模组都大同小异。关于8266的学习资料,大家可以参考安信可的相关资料,网址如下:http://wiki.ai-thinker.com/esp8266,ESP8266的使用普片性不用多说。为何要使用Alios things开发呢,这其中我挣扎许久。学习使用了安信可的nonos以及RTOS开发使用后,想要实现8266直连阿里云实现语音控制还需要很长的路要走,而使用Alios things的linkkit工程,只需要简单的几步就能实现82._aliosthings不支持8266了

Python教程:zip 函数的用法_python的zip用法-程序员宅基地

文章浏览阅读1.8w次,点赞19次,收藏72次。zip() 接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个 tuple,然后返回由这些 tuple 组成的 list。若传入参数的长度不等,则返回 list 的长度和参数中长度最短的对象相同。利用 * 号操作符,可以将 list 解压。Python3.0开始,zip()函数已经不返回 list 了,而是返回 iterable(可迭代对象)。这个可迭代对象需要特别注意,只能进行一次迭代遍历,第二次遍历就是空了。这个坑了我一个多小时。简单示例a = [1, 2, 3]b = [4, _python的zip用法

vue中$emit触发的事件,$on 第一次监听不到数据,利用eventBus解决,并进行页面动态响应_this.$nuxt $emit后的数据没有监听到-程序员宅基地

文章浏览阅读7.5k次,点赞2次,收藏9次。组件与页面之间想通过$ emit,来触发一个事件,传递数据,可是当在目标页面利用$on监听事件,获取数据时,发现第一次并不能监听到事件,而返回再次点击就可以监听到数据。原因在于$ emit 先于$ on 执行了,Vue并没有储存监听事件,所以无法监听到数据。因为不想用vuex来解决,所以利用eventBus来解决,而且组件不直接通过$on来存储数据,而是利用bus实例来存储数据,然后组件只负责..._this.$nuxt $emit后的数据没有监听到

809 协议相关_809协议-程序员宅基地

文章浏览阅读442次。809 协议。_809协议

RGBA与RGB和区别与转换_rgba和rgb-程序员宅基地

文章浏览阅读3.8w次,点赞5次,收藏25次。R:红色值。正整数 | 百分数G:绿色值。正整数 | 百分数B:蓝色值。正整数 | 百分数A:Alpha透明度。取值0~1之间。(颜色的透明度)此色彩模式与RGB相同,RGB定义了颜色的红绿蓝值,在RGB模式上新增了Alpha透明度.alpha通道一般用作不透明度参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的(也就是看不见的),而数值为100%_rgba和rgb

随便推点

python 监听键盘事件——记录我的上下班时间(~ ̄▽ ̄)~_python键盘时间监听-程序员宅基地

文章浏览阅读659次。闲的无聊,记录下上下班时间。背景,不怎么关电脑,每天第一次敲键盘即为上班时间,每天按下锁屏快捷键(Windows键+L)即为下班。python2.7# -*- coding: utf-8 -*- ## by oldj http://oldj.net/ #import pythoncomimport pyHookimport osimport datetimeimport..._python键盘时间监听

ApacheCN 公众号文章汇总 2019.7_从入门到冠军 中国移动人群画像赛top1经验分享-程序员宅基地

文章浏览阅读2.9w次。ApacheCN 优质博文推荐计划正式启动接受以下主题的博文:人工智能(论文解读,比赛心得,面经,知识点讲解)环材化生劝退CS 留学申请,IT 外企求职每日从所有投稿中精选两篇,在 ApacheCN 全公众平台推送。请在 apachecn/awesome-article-recomm 仓库新建 Issue,按以下格式填写:博文地址是否为个人原创投稿推荐语原作者信息(选..._从入门到冠军 中国移动人群画像赛top1经验分享

PB转纯BS工具_pbtoweb-程序员宅基地

文章浏览阅读405次。窗口将转化为web窗口form.js 其中pbcode为pb导出的源码目录, w_test_amis为要导出窗口的名称, d:/form.js为导出的代码目录 --js表示导出为js窗口。可以在事件中添加自己的处理代码,控件操作和pb中基本一致。更多信息,QQ群:836173975。导出后的form.js类似这样。_pbtoweb

双口ram存储器_C程序如何存储在RAM存储器中-程序员宅基地

文章浏览阅读380次。双口ram存储器 当您运行任何C程序时,其可执行映像都会以有组织的方式加载到计算机的RAM中,这称为C程序的进程地址空间或内存布局。 在这里,我试图分两部分向您展示同一件事。 /!\:最初发布于www.vishalchovatiya.com 。 在第1部分(即“概述”)中,我们将看到逐段概述;在第2部分(即“示例”)中,我们将看到C程序如何存储在RAM存储器中? 举个例子。 第1部分..._c __at (ram_addr)

navicat不能创建函数_navicat invaild stored procedure syntax-程序员宅基地

文章浏览阅读4.7k次。第一次写MySQL FUNCTION,一直报错,Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`company_id` int) RETURNS v_navicat invaild stored procedure syntax

android中activity的四种加载模式_android activity加载-程序员宅基地

文章浏览阅读1.8w次,点赞2次,收藏26次。一、何为加载模式在android的多activity开发中,activity之间的跳转可能需要有多种方式,有时是普通的生成一个新实例,有时希望跳转到原来某个activity实例,而不是生成大量的重复的activity。加载模式便是决定以哪种方式启动一个跳转到原来某个Activity实例。二、加载模式有哪些以及如何配置1、在android里面,activity有四种加载模式:standard, singleTop, singleTask, singleInstance 。详细介绍在后面。2、配置方法直接修改A_android activity加载