《从设计到模式》学习笔记part1
http://study.163.com/course/courseMain.htm?courseId=752006#/courseMain
(教程前5节免费预览,可以试看一下)
通过购买了上面的这个从设计到模式的视频的宣讲教程,感觉导师从比较通俗易懂的方式来体会和理解从设计到模式,如何产生的,为什么会产生,以及他们在实际项目中的应用等等方面,都有了比较深刻的认识,根据自己学的和看视频,自己也总结了一下自己的学习笔记,供大家一起来更简洁的掌握和理解设计模式,有不对的地方欢迎大家指正。
一 . 设计原则
不管什么新的技术,新的技能,他的产生比较导致一些标志,以及一些标志的产生,如果没有这些标准来衡量的话,那我们也没办法知道他新在哪里,怎么去判断,所以作为设计模式,那么必然也会有他的设计原则和标准在里面,如果这些标准和原则,那我们没办法去设计了。
1. S - 单一职责原则:
一个类只能有一个让它变化的原因。(我的理解是一个类就干它应该干的事情,比如我的一个邮件类,那么我这个类就只管我邮件发送,注册相关的功能,不会再这个类里面还做什么会员注册等到其他的功能,单一化原则,我觉得就是单一化模块功能。)
2. O - 开放封闭原则:
对扩展开放,对修改封闭。(我的理解是后期随着业务已经功能的扩展,这个类只允许扩展功能,不允许修改--也就是对扩展开发,对修改关闭)
3. L - Liskov原则:
子类可以完全覆盖父类。(我的理解 类似与子类对抽象类中的抽象方法的重写override)
4. I - 接口隔离原则:
每个接口都实现单一的功能。(我的理解是功能单一化,新的功能重新增加新的接口和方法,禁止在原来的接口上修改,禁止出现臃肿的接口--这里同时符合单一职责原则和开发封闭原则。)
5.D – 依赖倒置原则:
具体依赖于抽象,而非抽象依赖与具体。即,要把不同子类的相同功能抽象出来,依赖与这个抽象,而不是依赖于具体的子类。(我的理解是,相同功能的功能和模块,我们把这些相同的功能抽象出来,放到这个抽象的类中,然后通过子类去实现这些重新中的方法即可,我们这里依赖抽象的,而不是具体的某个子类)
既然上面的这些标准和原则出来了,那么我们就想当然的去创建对象,当然创建的对象必须要遵循上面的这些设计原则。
二 . 创建一个对象
1 限制单一对象
在我们实际项目中有很多在系统中必须限制一个入口的地方,比如数据库连接的字段,系统访问次数等等,那么作为设计者如何去规避其他的不正规操作,或者限制他就是仅能创建一个对象呢? 这是就出现了单例模式,那么他的出现就是为了限制单一对象,仅有一个。
那么啥是单例模式,他的怎么设计的?
class Singleton
{
private static Singleton instanc;
private Singleton () //注意这里必须用 private 私有的,这样才不能被外界new一个新的对象 ,保证了唯一性
{
}
public static Singleton GetInstanc()
{
if(instanc==null)
{
instanc=new Singleton (); // 让内部去实例化保证了唯一性
}
return instanc;
}
}
当然不是所有的都想要实现唯一性的就必须使用单例模式,我们也可以使用静态类,静态方法,配置文件,全局量量都可。
2 拷贝创建 --原型模式
创建对象我们可以通过new去创建,但是当我们需要创建一个两个一模一样的对象的时候,这时候就问题来了,是不是我们必须用new重新去创建一个对象,然后把对应对象的属性值一个个的去赋值一遍,如果这样的话那多麻烦,如果对象的属性很多,那将是繁琐的工作量,当然这里就出现了拷贝创建的功能设计--克隆。
C# 在内置的库中已经帮我们定义了这种功能接口 ---IColoneable,因此我们不需要在去定义了,哪里需要用到了这个功能的时候我们只需要实现这个接口就好。
3 创建家族 ---简单工厂模式
那么这里就用一个简单的案例来分析理解:我们试想一下这种场景,当初我们开发的系统用的是SQL数据,但是随着业务的扩展的需要,需要换其他的oracle数据库了,当初我们使用的
SQLDBhelper heleper=new SQLDBhelper();
修改成
OracleDBhelper heleper=new OracleDBhelper();
如何后期又要修改其他的数据库类型呢? 那我们是不是又要写一个新的new??
那么我们这里可以抽象一个 IDBHelper,那业务实现,我们只需要 IDBhelper = new SQLDBhelper(); 或者 IDBhelper =OracleDBhelper() 等等其他类型的数据库,这里不需要修改太多即可完成业务上面的需要。
以上只是几个简单的工厂模式小小应用,另外还有工厂方法模式,抽象工厂模式,都是在这个简单工厂模式上面的在抽象,分离,演变而来。
总结一下:
简单的工厂:只是将对象的创建过程简单的封装而已
工厂方法:在简单工厂的基础上,将创建过程抽象,派生出子类,又具体的子类创建对象,适合创建一个组合对象。
抽象工厂:在抽象方法的基础上,每个子类都被赋予创建多个对象的创建功能,适合创建一个家族对象,
在实际应用中,程序需要哪种工厂模式,需要根据业务以及不同的复杂程度来使用。
4 复杂多配置对象 --建造者模式
我们把对象创建的过程抽象出来,做成一个框架,然后派生不同的子类,来实现不同的配置,将复杂对象的构建与其表示分离,这就是建造者模式
其实不管上面多少种模式,他们的所遵循的原则还是上面说到的几个原则,百变不离其中。