一、设计模式总览
设计模式是一种思想,要理解思想,不要死记硬背
创建型模式(Creational Patterns)
- 单例(Singleton)模式
- 原型(Prototype)模式
- 工厂方法(FactoryMethod)模式
- 抽象工厂(AbstractFactory)模式
- 建造者(Builder)模式
结构型模式(Structural Patterns)
- 代理(Proxy)模式
- 适配器(Adapter)模式
- 桥接(Bridge)模式
- 装饰(Decorator)模式
- 外观(Facade)模式
- 享元(Flyweight)模式
- 组合(Composite)模式
- 过滤器模式(Filter Pattern)
行为型模式(Behavioral Patterns)
- 模板方法(Template Method)模式
- 策略(Strategy)模式
- 命令(Command)模式
- 职责链(Chain of Responsibility)模式
- 状态(State)模式
- 观察者(Observer)模式
- 中介者(Mediator)模式
- 迭代器(Iterator)模式
- 访问者(Visitor)模式
- 备忘录(Memento)模式
- 解释器(Interpreter)模式
二、设计的7大原则
①开闭原则(Open Closed Principle,OCP)
如果存在在一个系统A,要对系统A的实现类A1进行增强,我们应该重新创建一个实现类B1进行增强,而不是去修改A1类 (扩展新类而不是修改原类)
②里氏替换原则(Liskov Substitution Principle,LSP)
父类的自身方法不能修改,子类只能去修改父类提供的扩展方法 (继续父类而不是去改变父类)
相当于继承父类的遗产,而不是让父类去干什么干什么,去改变父类
③依赖倒置原则(Dependence Inversion Principle,DIP)
就像Controller 注入 Serivece ,Service 注入Dao ,而具体的实现由Dao的xml或者Service中的Impl去实现, (面相接口编程而不是面向实现类 )
④单一职责原则(Single Responsibility Principle,SRP)
每个类只负责自己管理的事情就行了,每个类应该为细粒度类,把功能不断进行划分,当然单一职责不代表就是在一个类中只有一个方法
⑤接口隔离原则(Interface Segregation Principle,ISP)
各类类建立自己的专用接口,而不是建立万能的接口
⑤迪米特法则(Law of Demeter,LoD)
假如有系统中有A、B、C、D...很多类,A如果要去调用、B、C、D,不能把B、C、D直接写入A类中,这是最多知道了,就比如一个国家负责人要知道人民的生活情况,可以建立一个社保部门,然后去问社保部门的负责人去了解,而不是去从每一个人中去了解。当然,如果过度的设计迪米特法则,就是产生过多的中间者 (无需直接交互的两个类,如果需要交互,使用中间者)
⑥合成复用原则(Composite Reuse Principle,CRP)
-
我们应该把相同功能的方法组合起来进行使用,而不是继承进行使用 (优先组合,其次继承)
-
所谓组合,就是把要引用的对象放在我的类中当成属性,然后根据属性进行方法调用,而不是直接继承
-
所谓继承,就是直接继承对象,然后继承对象的方法 (组合:我有对方,继承:对方是我父)
三、创建型模式的作用
见名知意,创建型模式就是想考如何把对象创建出来,这种模式只关注对象如何创建,而不在意对象如何使用,因此,把对象的创建和使用分离,这样就可以减低了系统的耦合度,体现了高内聚低耦合中的低耦合,这种模式设计之后就可以让调用者不再关注对象的创建的细节
在这种模式中,我们可以让工厂类帮我们创建对象 (各种工厂模式)
也可以让建造者帮我们创建对象,类似与工人一步一步把我们需要的房子建造出来,(建造者模式)
也可以由原来的对象通过克隆出一个一样的对象供我们使用,就比如条件允许的话,我们可以通过克隆爱因斯坦出来,而不是通过等待一个像爱因斯坦一样聪明的人,克隆的效率更高 (原型模式)
我们在系统中有很多相同的一个类,但我们需要这个类是一样的 (单例模式)
3.1 单例(Singleton)模式
在单例模式下一个类只能有一个实例,该实例可以通过一个全局访问点来访问。单例模式通常用于控制对唯一实例的访问,并且可以节省系统资源,避免多次创建实例。常见的单例模式包括懒汉式单例、饿汉式单例和双重检查锁单例等。通过单例模式,可以确保一个类在任何情况下只有一个实例存在。
单例的的代码实现逻辑有
- 构造器私有可以实现这个类只能是只有一个实例
- 必须实现自行创建实例的方法
- 自己去实现对外提供的实例化方法
代码实现
1.建立Earth类
Java
public class Earth {
private String earthNameAge;
//懒汉
private volatile static Earth instance;
//构造器私有,外部不能实例化
private Earth() {
System.out.println("make Earth");
}
//提供给外部的方法
//1、双重检查锁+内存可见性(设计模式)
public static Earth getEarth() {
//如果没有再去创建
if (instance == null) {
synchronized (Earth.class) {
if (instance == null) {
//多线程问题
instance = new Earth();
}
}
}
return instance;
}
}
2.建立MainTest方法测试
java
public class MainTest {
public static void main(String[] args) {
Earth earth1 = Earth.getEarth();
Earth earth2 = Earth.getEarth();
System.out.println(earth1 == earth2);
}
}