创建型模式,顾名思义,就是创造出一个对象等,在繁多的实物对象之中,我们应如何有条理的创建对象呢?下面的5种设计模式来告诉我们方法。
一、总括
二、细述
单例模式
故事:
有些类也需要计划生育!在点击一个按钮之后会弹出一个窗口,然而再点一次就会再次出现一个窗口,进而重复了,我们需要对这些窗口做计划生育!
定义:
保证一个类仅有一个实例,并提供一个访问他的全局访问点。
UML:
优点:
1、通常我们可以让一个全局变量使得一个对象被访问,但他不能防止你实例化多个对象。一个最好的办法就是让类自身负责保存他的唯一实例,这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。
2、可以严格的控制他的唯一实例,这样他可以严格的控制客户怎样访问他,以及何时访问他,简单的说,就是对唯一实例的受控访问。
用途:
1、形成唯一的实例
2、对于多线程时,分为两种实例,饿汉式单例(静态初始化的方式是在自己被加载时就将自己实例化)和懒汉式单例(第一次被引用时将自己实例化)。
与机房收费系统:
1、调出窗体
2、结账
3、上下机计算
工厂方法模式
故事:
雷锋帮助人做好事,一个人的力量小,需要有一个雷锋工厂,被帮助的人,不需要知道是谁来,直知道是学雷锋的那个团体来的。
定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
UML:
优点:
1、对于简单工厂模式,他的优点是工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了具体产品的依赖。但是!简单工厂中,如果要加一个M的N次方的计算,我们就必须要修改原有的类了,也就不符合开放--封闭原则了,所以,我们要引出工厂方法模式。
2、工厂模式在于:将简单工厂的工厂类,变成一个工厂抽象接口和多个具体生成对象的工厂,所以我们在加一个M的N次方的时候,就不需要再修改原来的类,只需要再添加一个此功能的运算类,和相应的工厂类就可以,让接口来创建抽象产品的工厂方法。
用途:
客户端决定实例化哪一个工厂来实现运算类,选择判断的问题。之前的简单工厂是在内部逻辑判断,但工厂模式是在客户端代码来进行,就不用修改工厂类了!!
与机房:
无
抽象工厂模式
故事:
换不同的数据库系统。
定义:
提供一个创建一系列相关或相互依赖的借口,而无需指定他们具体的类。
UML:
工厂方法:
抽象工厂方法:
优点:
1、便于交换产品系列,改变一个具体的工厂变得非常容易,只需要改变具体的工厂即可使用不同的配置。
2、让具体的创建实例的过程与客户端分离,客户端是通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。
缺点:
增加一个User表或其他表 要写的代码太复杂。
改进:
(用简单工厂模式来改进)
这里用一个DataAccess来实现,不用分成两个SQL和Access类了。直接Creat.
但是!!
如果在增加一个数据库呢?就需要在DataAccess类里面用switch 和case了。这里我们有一种编程方式:依赖注入(也就是反射!) 来解决我们的Switch 问题,即利用 字符串变量 来选择用哪个数据库!
用途:
1、在只有一个User类和操作类的时候,是只需要工厂方法,但数据库中有多个表,而SQL 和Access两大类的数据库 用这样专门抽象工厂模式。
2、在1的基础上,我们利用简单工厂模式,用反射+配置文件来实现数据访问程序!(在所有用到简单工厂模式的地方,都需要用到反射技术来除去switch或if,解除分支判断带来的耦合!
建造者模式
故事:画一个小人,为了避免少画胳膊和腿,先有一个固定的模板吧!
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示!
UML:
优点:
是建造代码与表示代码分离,由于建造者模式隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
用途:
1、创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常都面临着复杂的变化。
2、是在创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式。
与机房:
结账方式,打折了,怎么算。
原型模式
故事:
复制简历,一个简历,可以有一个模板,来让用户自己往里面自定义添加多个。
定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
UML:
优点:
1、直接克隆就行,在system命名空间中提供了IConeable接口,用Clone方法,通过实现接口来完成原型模式。
2、一般在初始化的信息不发生变化的时候,克隆是最好的办法,既隐藏了对象创建的细节,有对性能是大大的提升。
用途:
1、浅复制:被复制的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
2、深复制:复制引用,把对象的引用变量指向复制过的新对象,而不是原有的被引用的对象。
好了,这便是所有的创建型的设计模式,单例、工厂方法、抽象工厂、建造者、原型 都是在不同的情况下讲述如何创建一个个对象更有效,希望在以后的现实中,我们可以熟练的用好这些模式!