一、设计原则
1、开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。
2、里氏代换原则(Liskov Substitution Principle)
里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP 是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对 “开 - 闭” 原则的补充。实现 “开 - 闭” 原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。
3、依赖倒转原则(Dependence Inversion Principle)
针对口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(Interface Segregation Principle)
使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思:降低依赖,降低耦合。
5、迪米特法则(最少知道原则)(Demeter Principle)
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(Composite Reuse Principle)
原则是尽量使用合成 / 聚合的方式,而不是使用继承
二、常见设计模式
(一)工厂模式
1.作用:一个抽象的接口,多个抽象接口的实现类,一个工厂,用来实例化抽象的接口。
2.优点:一个调用者想创建一个对象,直接向工厂请求即可,不需要知道具体实现,以提高系统的可维护性、可扩展性。
3.缺点:产品修改时,工厂也要进行修改。
(二)抽象工厂模式
1.作用:抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。
2.优点:当一个产品类型(每一类中有多个产品)被设计成一起工作时,有良好的维护性。
3.缺点:产品类扩展困难。
(三)单例模式
1.作用:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2.特点
-
单例类只能有一个实例。
-
单例类必须自己创建自己的唯一实例。
-
单例类必须给所有其他对象提供这一实例。
3.单例模式分为懒汉式和饿汉式
- 饿汉式:在程序启动或单件模式类被加载的时候,单例模式实例就已经被创建。
- 懒汉式:当程序第一次访问单例模式实例时才进行创建。
如何选择:
如果单件模式实例在系统中经常会被用到,饿汉式是一个不错的选择。
反之如果单件模式在系统中会很少用到或者几乎不会用到,那么懒汉式是一个不错的选择。
【代码示例】
//饿汉式单例模式
class Singleton{
//私有的构造函数,保证外类不能实例化本类
private Singleton(){
}
//自己创建一个类的实例化
private static Singleton singleton = new Singleton();
//创建一个get方法,返回一个实例s
public static Singleton getInstance(){
return singleton;
}
//懒汉式单例模式
class Singleton {
// 私有的构造函数,保证外类不能实例化本类
private Singleton() {
}
// 自己创建一个类的实例化
private static Singleton singleton;
// 创建一个get方法,返回一个实例s
public static Singleton getInstance(){
//判断singleton是否为null,如果为null,即判定需要实例化
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
懒汉式在多线程中是不支持的,所以相对来说,更多的是用饿汉式
(四)适配器模式
1.作用:将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
2.模式中的角色
-
目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
-
需要适配的类(Adaptee):需要适配的类或适配者类。
-
适配器(Adapter):实现了目标接口,通过包装一个需要适配的对象,把原接口转换成目标接口。