设计模式总结 之 创建型
来源:互联网 发布:windows正版激活工具 编辑:程序博客网 时间:2024/05/02 00:25
设计模式总结 之 创建型
参考:
http://blog.csdn.net/jason0539
设计模式和原则 强烈推荐 http://blog.csdn.net/zhengzhb/article/category/926691
总共有24中设计模式,分为3类:
创建型模式,共六种:单例模式、简单工厂、抽象工厂模式、工厂方法模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
1. 单例模式 SingleTon
结构解析:
java中 单例类中私有化构造函数和实例化对象 防止创建新实例和直接访问实例 饭后提供访问实例的方法
scala中直接object即可
public class Singleton { private Singleton() {} private static Singleton single=null; //静态工厂方法 public static Singleton getInstance() { if (single == null) { single = new Singleton(); } return single; } }
最简单的模式,单列类只有一个实例,类中静态实现,对外提供访问该例的方法
scala中实现只需要 一个Object就可以实现单例模式
object LoadBalance { //服务器组 val servers = new ArrayBuffer[String]() /** * 增加服务器 * @param server 服务器名 */ def addServer(server: String) { println(s"add server :$server") servers += server } /** * 删除服务器 * @param server 服务器名 */ def removeServer(server: String) { println(s"remove server : $server") servers -= server } /** * 随机获取服务器转发 * @return 服务器名 */ def getServers(): String = { servers(Random.nextInt(servers.length)) }}/** * 单例测试客户端 */object Client extends App { Console.println("singleTon Client Test") // 构建负载均衡器1 val balance1 = LoadBalance // 构建负载均衡器2 val balance2 = LoadBalance //判断两个balance是否一致 println(s"两个均衡器是否一致 : ${balance1.eq(balance2)}") //添加服务器 balance1.addServer("server1") balance1.addServer("server2") balance1.addServer("server3") balance1.addServer("server4") //随机获取服务器 for (i <- 1 to 10) { println(s"get server : ${balance1.getServers()}") } //使用balance2删除 服务器 balance2.removeServer("server1") //随机获取服务器 for (i <- 1 to 10) { println(s"get server : ${balance1.getServers()}") }}
2. 简单工厂 SimpleFactory
结构解析:
抽象类产品
具体类产品
工厂 :根据输入参数选择返回具体的产品
简单工厂模式,根据外界给定的原料,在加上自身封装好的判断,生产出不同类型的相应的产品、对象。
简单工厂模式使用场景:工厂类负责创建的对象比较少;客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心
abstract class Chart { def display():Unit}/** * 柱状图,继承抽象图 */class HistogramChart extends Chart{ println("初始化柱状图") /** * 展示方法 */ override def display(): Unit = { println("显示柱状图") }}/** * 饼状图,继承抽象图 */class PieChart extends Chart{ println("初始化饼状图") /** * 展示方法 */ override def display(): Unit = { println("显示饼状图") }}/** * 折线图,继承抽象图 */class LineChart extends Chart{ println("初始化折线图") /** * 展示方法 */ override def display(): Unit = { println("显示折线图") }}/** * 工厂方法,用于产出具体产品 */object Chart { /** * 通过模式匹配更加优雅实现 * @param style 产品类型 * @return 具体产品 */ def apply(style:String) = style match { case "histogram" => println("创建柱状图");new HistogramChart case "pie" => println("创建饼状图");new PieChart case "line" =>println("创建折线图"); new LineChart }}/** * Created by ctao on 2015/8/6. * 测试客户端 */object Client2 extends App{ //产出饼状图 val pie = Chart("pie") pie.display() //产出柱状图 val histogram = Chart("histogram") histogram.display() //产出折线图 val line = Chart("line") line.display()}
3. 抽象工厂 AbstractFactory
结构解析:
抽象工厂:接口
具体工厂:object
抽象产品:接口
具体产品:具体工厂中的内部类
抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
/** * 皮肤工厂特质 */trait SkinFactory { def createButton():Button def createTextField():TextField }/** * 按钮特质 */trait Button{ def display():Unit}/***文本框特质*/trait TextField{ def display():Unit}/*** 春天皮肤工厂*/object SpringSkinFactory extends SkinFactory{ class SpringButton extends Button{ override def display():Unit=println("Spring Button") } class SpringTextField extends TextField { override def display():Unit=println("Spring TextField ") } override def createButton():Button=new SpringButton override def createTextField():TextField =new SpringTextField}/*** 夏天皮肤工厂*/object SummerSkinFactory extends SkinFactory{ class SummerButton extends Button{ override def display():Unit=println("Summer Button") } class SummerTextField extends TextField { override def display():Unit=println("Summer TextField ") } override def createButton():Button=new SummerButton override def createTextField():TextField =new SummerTextField}/***客户端测试* */object Client3 extends App{ /** * 创建皮肤工厂 */ val factory :SkinFactory = SpringSkinFactory factory.createButton().display() factory.createTextField().display()}
4.工厂模式 Factory
简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例
工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。
抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
结构解析:
工厂接口:Factory
具体工厂:object 每个工厂返回自己的产品DatabaseLoggerFactory
产品接口:Logger
具体产品:DataBaseLogger FilLogger
工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。
trait Factory { def createLogger():Logger}trait Logger { def writeLog():Unit}class DatabaseLogger extends Logger{ override def writeLog(): Unit=println("数据库日志记录")}class FileLogger extends Logger{ override def writeLog():Unit = println("文件日志记录")}object DatabaseLoggerFactory extends Factory{ override def createLogger(): Logger = new DatabaseLogger}object FileLoggerFactory extends Factory{ override def createLogger():Logger = new FileLogger}/***测试客户端*/object Client4 extends App{ val logger1:Factory = DatabaseLoggerFactory val logger2:Factory = FileLoggerFactory logger1.createLogger().writeLog() logger2.createLogger().writeLog()}
5.建造者模式 Builder
结构解析:四要素
1.产品类 Actor
2.抽象创建者 ActorBuilder
3.创建者 HeroBuilder DevilBuilder
4.导演类
创建者模式是创建型模式中最负责的一个设计模式了,创建者负责构建一个对象的各个部分,
并且完成组装的过程.构建模式主要用来针对复杂产品生产,分离部件构建细节,以达到良好的伸缩性。
把构造对象实例的逻辑移到了类的外部,在这个类外部定义了这个类的构造逻辑
并且完成组装的过程.构建模式主要用来针对复杂产品生产,分离部件构建细节,以达到良好的伸缩性。
把构造对象实例的逻辑移到了类的外部,在这个类外部定义了这个类的构造逻辑
trait ActorBuilder { protected var actor: Actor def buildRole(): Unit def buildSex(): Unit def buildFace(): Unit def buildCostume(): Unit val BareHead = false def buildHairStye(): Unit def creatActor(): Actor /* * 控制枢纽,控制每一步的顺序 */ def construct(ab: ActorBuilder): Actor = { //先设置角色,再设置性别,其次是脸型,服装,用钩子程序判断是否是光头,不是光头则设置发型 ab.buildRole() ab.buildSex() ab.buildFace() ab.buildCostume() if (!ab.BareHead) { ab.buildHairStye() } ab.creatActor() }}class Actor { var role: String = _ var sex: String = _ var face: String = _ var costume: String = _ var hairStye: String = "光头"}object HeroBuilder extends ActorBuilder { override protected var actor: Actor = new Actor() override def buildRole() = actor.role = "英雄" override def buildSex() = actor.sex = "男" override def buildFace() = actor.face = "英俊" override def buildCostume() = actor.costume = "盔甲" override def buildHairStye() = actor.hairStye = "飘逸" override def creatActor() = actor}object DevilBuilder extends ActorBuilder { override protected var actor: Actor = new Actor() override def buildRole() = actor.role = "恶魔" override def buildSex() = actor.sex = "妖" override def buildFace() = actor.face = "丑陋" override def buildCostume() = actor.costume = "黑衣" override def buildHairStye() = actor.hairStye = "我想要头发" /** * 由于钩子程序的存在并不会执行buildHairStyle */ override val BareHead = true override def creatActor() = actor}/** * 测试客户端 */object Client5 extends App { val ab1: ActorBuilder = HeroBuilder val actor1 = ab1.construct(ab1) println(actor1.sex) val ab2: ActorBuilder = DevilBuilder val actor2 = ab2.construct(ab2) println(actor2.sex)}
6.原型模式 prototype
结构解析:
原型类
原型实现类 java中是重写clone函数让类课被复制
原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.
原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据.
原型模式中的拷贝分为"浅拷贝"和"深拷贝":
浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.
深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据.
原型模式中的拷贝分为"浅拷贝"和"深拷贝":
浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.
深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
/** * 样例类:周报 */case class WeeklyLog(var name: String, var date: String, var context: String, var attachment: Attachment)/** * 附件类样例 */case class Attachment(var name: String) { def download() = println(s"下载附件,附件名为:$name")}//object Client6 extends App { //不使用原型// var log_previous = new WeeklyLog("王颖", "周六", "报告内容", new Attachment("报告.ppt"))// val log_new = log_previous.copy()// /**// * 结果为false,由此可以看出为深克隆// * Java支持我们对一个对象进行克隆,通常用在装饰模式和原型模式中。那么什么是深克隆,什么是浅克隆呢。// *// * 【浅克隆】,通常只是对克隆的实例进行复制,但里面的其他子对象,都是共用的。// *// * 【深克隆】,克隆的时候会复制它的子对象的引用,里面所有的变量和子对象都是又额外拷贝了一份。// */// println(log_new.eq(log_previous))//// /**// * 结果为true,附件对象为浅克隆// */// println(log_new.attachment.eq(log_previous.attachment))//}/** * 原型管理器 *///*************以下为使用原型case class OfficeDocument(title: String) { def display(): Unit = { println(s"公文标题为:$title") }}/** * 可行性分析报告 */class FAR(title: String) extends OfficeDocument(title)/** * 软件需求规格书 */class SRS(title: String) extends OfficeDocument(title)object PrototypeManager { //存储officedocument对象 var ht = new scala.collection.mutable.HashMap[String, OfficeDocument] ht += ("far" -> new FAR("<可行性报告>")) ht += ("srs" -> new SRS("<软件规格需求说明书>")) //增加文章模板 def addOfficeDucoment(key: String, officeDocument: OfficeDocument) = ht += (key -> officeDocument) //获取模板 def getOfficeDocument(key: String): OfficeDocument = ht.getOrElse(key, new OfficeDocument("null")).copy()}/** * 测试客户端 */object Client6 extends App { //原型管理器 val pr = PrototypeManager //公文对象 从hashmap中获取克隆对象 val doc1 = pr.getOfficeDocument("") val doc2 = pr.getOfficeDocument("") doc1.display() doc2.display() println(doc1.equals(doc2))}
1 0
- 设计模式总结之创建型模式
- 设计模式总结之创建型
- 设计模式总结 之 创建型
- JS设计模式之创建型设计模式总结
- 设计模式学习之创建型模式学习总结
- C#设计模式之——创建型模式总结
- 设计模式总结之二创建型模式
- 大话设计之模式总结——创建型模式
- 设计模式之创建类模式总结
- 设计模式---创建型设计模式总结
- 创建型设计模式总结
- 创建型设计模式总结
- 设计模式:创建型总结
- 创建型设计模式总结
- 【软考总结】设计模式之创建型
- 设计模式阶段性总结之对象创建
- 设计模式之创建型设计模式
- 设计模式学习总结-创建型模式
- UML类图与类的关系详解
- Android Service使用误区
- JavaScript 中 this 的详解
- paho 推送参考
- html笔记
- 设计模式总结 之 创建型
- Python 命令汇总
- 从零开始学习音视频编程技术(十九) 录屏软件开发之YUV AAC合成MP4
- iOS网络学习地址
- Annotation原理
- 第四轮GDOI比赛模拟の总结
- 系列:iOS开发-网络请求
- AD
- Vuex 模块化实现待办事项的状态管理
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
小刀电动车怎么样
小刀电动车价格图片
小刀电动车图片
小刀破解论坛
小刀电动车质量曝光
可小刀神马意思
小刀电动车解除限速
可小刀什么意思
小刀电动车怎么解除限速
衣服磁扣小刀打开图解
小刀什么意思
小刀电动车限速
小刀和雅迪哪个好
小刀娱乐辅助网
溺水小刀在线播放
溺水小刀剧情解析
可小刀是什么意思
接受小刀是什么意思
价格小刀啥意思
可小刀一般范围是多少
小刀电动车多少钱
小刀电车怎么样
风流断剑小小刀
小刀电动车厂家
小刀电动车价格
小刀电动车厂家电话
小刀牌电动车
剥皮小刀哪里买
大刀小刀是什么意思
小刀酒怎么样
什么叫可小刀
小刀电动车好不好
小刀电瓶车怎么样
小刀和爱玛哪个好
可以小刀是什么意思
小刀酒多少钱一瓶
小刀电动车电话
小刀四轮电动车
小刀折叠电动车
小刀电动车电话号码
小刀电动车如何