创建型设计模式
- 一、六大基本原则
- 1、单一职责原则
- 2、开闭原则
- 3、里氏代换原则
- 4、依赖倒置原则
- 5、接口隔离原则
- 6、迪米特法则
- 二、设计模式总览
- 三、具体代码实现
- 工厂设计模式
- 抽象工厂设计模式
- 建造者设计模式
- 原型设计模式
- 单例设计模式
- 五种设计模式的主要代码以及实现包
一、六大基本原则
1、单一职责原则
一个类只能有一个职责。一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中。
2、开闭原则
一个软件实体应该对扩展开放,对修改关闭。即软件实体尽量在不修改原有代码的情况下进行扩展。
3、里氏代换原则
所有引用父类的地方必须能透明地使用其子类的对象。
4、依赖倒置原则
高层模块不应该依赖低层模块,抽象不应该依赖细节,细节应该依赖抽象。要面向接口编程,不要面向实现编程。
5、接口隔离原则
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。当一个接口太大时,我们需要考虑将它分离成一个更小的接口。
6、迪米特法则
尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,如果其中一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。
二、设计模式总览
三、具体代码实现
工厂设计模式
⼯⼚模式⼜称⼯⼚⽅法模式,是⼀种创建型设计模式,其在⽗类中提供⼀个创建对象的⽅法, 允许⼦类 决定实例化对象的类型。
这种设计模式也是 Java开发中最常⻅的⼀种模式,它的主要意图是定义⼀个 创建对象的接⼝,让其⼦ 类⾃⼰决定实例化哪⼀个⼯⼚类,⼯⼚模式使其创建过程延迟到⼦类进⾏。
简单说就是为了提供代码结构的扩展性,屏蔽每⼀个功能类中的具体实现逻辑。让外部可以更加简单的 只是知道调⽤即可,同时,这也是去掉众多ifelse的⽅式。
当然这可能也有⼀些缺点,⽐如需要实现 的类⾮常多,如何去维护,怎样减低开发成本。但这些问题都可以在后续的设计模式结合使⽤中,逐步 降低。
抽象工厂设计模式
抽象工厂设计模式(Abstract Factory Design Pattern)是一种创建型设计模式,旨在提供一个接口用于创建相关或依赖对象的家族,而无需明确指定它们的具体类。这种模式属于工厂模式的一种扩展,它通过提供一个接口来创建一系列相关或相互依赖的对象,而不需要指定这些对象的具体类。
建造者设计模式
建造者模式所完成的内容就是通过将多个简单对象通过⼀步步的组装构建出⼀个复杂对象的过程。
它的主要目的是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
原型设计模式
原型模式主要解决的问题就是创建重复对象。这部分对象内容本身比较复杂,生成过程耗时较长,因此使用clone()方法节省时间
这种场景经常出现在我们身边,只不过很少用到自己的开发中,就像CV复制代码,类中的clone()方法。
单例设计模式
单例模式是整个设计中最简单的模式之一。
单例模式主要解决的是哪怕多线程同时访问,一个类也只能有一个实例。
本节介绍7种单例模式的实现:懒汉模式(线程不安全)、懒汉模式(线程安全)、饿汉模式(线程安全)、使用类的内部类(线程安全)、双重锁校验(线程安全)、CAS[AtomicReference](线程安全)、Effective Java作者推荐的枚举单例(线程安全)。
五种设计模式的主要代码以及实现包
代码实现在文章顶部显示,由于代码量较大,再次仅贴出代码目录以及部分代码,不过多占用文章篇幅。
抽象工厂:
public class Client {private Button button;private Window window;public Client(GUIFactory factory){button = factory.createButton();window = factory.createWindow();}public void renderUI(){button.render();window.render();}public static void main(String[] args) {GUIFactory factory;String name = System.getProperty("os.name").toLowerCase();if(name.contains("windows")){factory = new WindowsGUIFactory();}else{factory = new MacOSGUIFactory();}Client client = new Client(factory);client.renderUI();}
}