什么是设计模式?
设计模式(Design Patterns)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。
设计模式分类:(3大类,23种)
创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
行为型模式:模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、责任链模式。
一,单例模式:
采取方法,使整个软件系统中,对某个类只存在一个对象实例。并且该类只提供一个取得其对象实例的方法(静态方法)。
实现的类型:
1)饿汉模式:
饿汉模式就是当类加载时就创建该类的实例,这是创建单例类最容易的方法但是有个一弊端是创建了该实例但是客户端程序可能不使用这个实例。
2)静态初始化:
静块初始化实现类似于饿汉模式初始化,但类的实例在静态代码块中创建并对异常进行处理。
3)懒加载:
懒加载就是当需要的时候再来创建该类的实例,而不是一开始就把实例创建好了。
4)线程安全的单例:
public class ThreadSafeSingleton {
private static ThreadSafeSingleton instance = null;
private ThreadSafeSingleton(){
}
//同步关键字synchronized
public static synchronized ThreadSafeSingleton getInstance(){
if(instance == null){
instance = new ThreadSafeSingleton();
}
return instance;
}
}
5)枚举单例
这种方法简单,便捷。
public enum EnumSingleton {
INSTANCE;
public static void doSomething(){
//do something
}
}
特点:
1)单例类只能有一个实例。
2)单例类必须自己创建自己的唯一实例。
3)单例类必须给所有其他对象提供这一实例。
二,工厂模式:
工厂模式包括:
1)简单工厂模式
又称为静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
- 将创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
- 把初始化实例时的工作放到工厂里进行,使代码更容易维护。 更符合面向对象的原则 & 面向接口编程,而不是面向实现编程。
2)工厂方法模式
工厂方法是针对每一种产品提供一个工厂类,通过不同的工厂实例来创建不同的产品实例。主要解决了简单工厂模式违背了“开放 - 关闭原则”的问题。
优点:
- 更符合开-闭原则,新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可
- 符合单一职责原则,每个具体工厂类只负责创建对应的产品
3)抽象工厂模式
抽象工厂模式允许使用抽象的接口来创建一组相关产品,而不需要知道或关心实际生产出的具体产品是什么,这样就可以从具体产品中被解耦。
优点:
-
降低耦合。抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展;
-
更符合开-闭原则。新增一种产品类时,只需要增加相应的具体产品类和相应的工厂子类即可。
设计模式六大原则:
-
单一职责原则:
单一职责原则表示一个模块的组成元素之间的功能相关性。通俗地说,一个类只负责一项职责。
目的:
1)降低类的复杂度
2)提高系统的可维护性
3)修改时降低风险溢出
-
里氏替换原则:
所有引用基类的地方必须能透明地使用其子类对象,子类在扩展父类功能时不能破坏父类原有的功能。
-
接口隔离原则:
一个类对另一个类的依赖应该建立在最小的接口上。
-
依赖倒置原则:
依赖:成员变量、方法参数、返回值要依赖于抽象,不要依赖于具体。高层模块不应该依赖低层模块,二者都应该依赖于其抽象。
-
迪米特原则:
一个对象应该与其他对象保持最少的了解。
-
开闭原则:
对扩展开放,对修改关闭,通过扩展已有软件系统,可以提供新的功能,修改的关闭,保证稳定性和延续性。