面向对象六大基本原则
以前一直认为程序中的类有使用到封装继承多态就是面向对象设计,其实不然
封装,继承,多态只是面向对象的三大特性,但是在设计程序的时候并不是说类的结构使用到了(或是体现出了)这三个特性就是面向对象,
其实真正的面向对象设计是要符合下面的五大原则,
面向对象的六大基本原则
开放封闭原则(OCP)
单一职责原则(SRP)
接口隔离原则(ISP)
里氏替换原则(LSP)
依赖倒置原则(DIP)
最小知道原则——最少调用原则,对外公布的内容越少越好,封装
程序设计的目标——高内聚,低耦合
为什么要有原则和模式——软件的需求在经常变化,软件要稳定地运行
稳定和变化时矛盾的,期望软件稳定,但是需求在经常变化,所以我们需要一些原则和经验来保证我们的软件在稳定的前提下应对新的需求
开放封闭原则(OCP)
• 对扩展是开放的,对更改是封闭的!——所谓更改封闭是不改变原有代码、或能安全地改变原有代码,尽量不改原有代码
• 扩展即扩展现行的模块,当我们软件的实际应用发生改变时,出现新的需求,就需要我们对模块进行扩展,使其能够满足新的需求!
更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!
这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!
其他原则统摄在此原则之下
单一职责原则(SRP)
• 不要让一个类承担太多的工作,特别是不相关的工作
难点:在于精准地切分类的功能
里氏替换原则(LSP)——凡是父类出现的地方,都可以用子类来替换
• 子类可以替换父类并且出现在父类能够出现的任何地方
• 这个原则也是在贯彻GOF倡导的面向接口编程!
在这个原则中父类应尽可能使用接口或者抽象类来实现!
尽量依赖父类、抽象类、接口
依赖倒置原则(DIP)
• 传统的结构化编程中,最上层的模块通常都要依赖下面的子模块来实现,也
称为高层依赖低层!
所以DIP原则就是要逆转这种依赖关系,让高层模块不要依赖低层模块,所以称之为依赖倒置原则!
ISP 接口隔离原则——接口最小原则
• 这个原则的意思是:使用多个专门的接口比使用单个接口要好的多!
这个我有体会,在我实际编程中,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!
单例模式的详解:深入浅出单实例Singleton设计模式 - 陈皓专栏 【空谷幽兰,心如皓月】 - CSDN博客
http://blog.csdn.net/haoel/article/details/4028232
设计模式的分类
***生产型设计模式——专门用于产生对象
最常用的是:单例和工厂(掌握),其次是builder(熟悉),prototype了解即可
---单例---
懒汉、饿汉、枚举
---工厂,最常用的是静态工厂和工厂方法,至于抽象工厂了解---
**Factory,
替代new,屏蔽创建过程,屏蔽产品的具体类型
1、静态工厂
Integer.valueOf();其实这就是一个静态工厂,在类中有一个静态方法产生自己的对象,这就叫做静态工厂,为什么要这样做,因为创建这个对象的过程不是简单的初始成员变量。
DateFormat.getInstance();
Class.forName
2、工厂方法(针对产品有继承体系的升级版,多态工厂)
class DataSourceFactory {
private DataSourceFactory(){}
public static DataSource get(DataSourceType type ) {
switch (type) {
case DBCP:
return DbcpDsFactory.me.getDataSource();
case JNDI:
throw new UnImplementionException("SIMPLE");
case SIMPLE:
return SimpleDataSource.me;
case C3P0:
return C3P0DsFactory.me.getDataSource();
default:
throw new UnImplementionException();
}
}
}
3、抽象工厂(针对多类产品、而且要组合产品的升级版)
一个工厂可以生产多类产品
**结构型设计模式——讨论类的关系组织的,特别多地用到了继承、组合
*行为型设计模式——讨论行为的切换或者顺序