一、什么是设计模式
是前辈们对代码开发经验的总结,是解决特定问题的一系列套路,它不是语法规定,而是一套用来提高代码复用性、可维护性、可读性、稳健性以及安全性的解决方案。
二、学习设计模式
1.设计模式的本质是面向对象设计原则的实际应用,是对类的封装性、继承性和动态性以及类的关联关系和组合关系的充分理解。
2.正确使用设计模式的优点:
(1)可以提高程序员的思维、编程能力和设计能力
(2)是程序设计更加标准化、代码编程 更加工程化,是软件开发效率大大提高,从而缩短软件的开发周期
(3)使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强
三、设计模式的基本要素
(1)模式名称:根据模块的功能,特点命名;
(2)问题:描述了该模式的应用环境,描述一个模式的前因后果;
(3)解决方案:提供一些解决问题的方法,以及具体实现步骤;
(4)效果:一个模式的优缺点,及时间和空间复杂度;
四、二十三种设计模式(GoF23)
1.创建型模式:单列模式、工厂模式、抽象工厂模式、建造者模式、原型模式
2.结构型模式:适配器模式,桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式
3.行为模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。
五、面向对象的七大原则(OOP七大原则)
1.开闭原则:对扩展开放,对修改关闭
2.里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立
3.依赖倒置原则:要面向接口编程,不要面向实现编程
4.单一职责原则:控制类的粒度大小、将对象解耦、提高其内聚性
5.接口隔离原则:要为各个类建立他们需要的专用接口
6.迪米特法则:只与你的直接朋友交谈,不跟陌生人说话;即使两个类之间有部分关系不要直接关联,建立第三方类,降低程序模块间的耦合度
7.合成复用原则:尽量先使用组合或聚合等关联关系来实现,其次再考虑使用继承关系来实现
六、模式详细内容
(一)单列设计模式
1.单列模式
单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。
2.单例模式有 3 个特点:
(1)单例类只有一个实例对象;
(2)该单例对象必须由单例类自行创建;
(3)单例类对外提供一个访问该单例的全局访问点。
3.单例模式的优点:
-
单例模式可以保证内存里只有一个实例,减少了内存的开销。
-
可以避免对资源的多重占用。
-
单例模式设置全局访问点,可以优化和共享资源的访问。
4.单例模式的缺点:
-
单例模式一般没有接口,扩展困难。如果要扩展,则除了修改原来的代码,没有第二种途径,违背开闭原则。
-
在并发测试中,单例模式不利于代码调试。在调试过程中,如果单例中的代码没有执行完,也不能模拟生成一个新的对象。
-
单例模式的功能代码通常写在一个类中,如果功能设计不合理,则很容易违背单一职责原则。
(1)饿汉单列模式
public class HungrySingleton {
private static final HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return instance;
}
}
(2)懒汉式单列:
package Singleton;
//懒汉式单列模式
public class LazySingleton {
private static boolean xiaozhang=false;
private LazySingleton() {
synchronized (LazySingleton.class){
if (!xiaozhang){
xiaozhang=true;
} else {
throw new RuntimeException("请勿用反射破坏单列模式!");
}
}
}
private static LazySingleton lsl;
public static LazySingleton getInstance(){
if (lsl==null){
synchronized (LazySingleton.class){
if (lsl==null){
lsl=new LazySingleton();
}
}
}
return lsl;
}
}
(3)枚举
package Singleton;
public enum EnumSingle {
INSTANCE;
public EnumSingle getInstance(){
return INSTANCE;
}
}