设计模式——六大原则和创建型模式

初学设计模式,建议可以参考菜鸟教程,里面讲的很详细,这里我总结一下设计模式的六大原则和创建型模式:

一、设计模式的六大原则:

1、开闭原则(Open Close Principle)

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等。

2、里氏替换原则(Liskov Substitution Principle)

面向对象设计的基本原则之一,是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。在进行设计的时候,我们应该尽量从抽象类继承,而不是从具体类继承.如果从继承等树来看,所有叶子节点应当是具体类,而所有的树枝节点应当是抽象类或者接口.当然这只是一个一般性的指导原则,使用的时候还要具体情况具体分析。

3、依赖倒转原则(Dependence Inversion Principle)

这个是面向对象设计的核心原则,具体内容:针对接口编程,不针对实现编程。依赖于抽象而不依赖于具体。写代码用到具体类时,不与具体类交互,而与具体类的上层接口交互。

4、接口隔离原则(Interface Segregation Principle)

每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。

5、迪米特法则(最少知道原则)(Demeter Principle)

一个类对自己依赖的类知道的越少越好。也就是说无论被依赖的类多么复杂,都应该将逻辑封装在方法的内部,通过public方法提供给外部。这样当被依赖的类变化时,才能最小的影响该类。即一个软件实体应当尽可能少地与其他实体发生相互作用,通过中间类建立联系。

6、合成复用原则(Composite Reuse Principle)

原则一句话:是尽量首先使用合成/聚合的方式,而不是使用继承。

二、创建型模式

简单工厂模式:

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,它不属于23种GOF设计模式,但是可以被认为是一种特殊的工厂方法模式,在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有相同的父类。

应用:

  • java.text.DateFormat

工厂方法模式:

简单工厂模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到工厂方法模式,在简单工厂中,创建对象的是另一个类,而在工厂方法中,工厂父类负责创建对象的公共接口,工厂子类来创建具体的对象。
设计模式——六大原则和创建型模式_第1张图片
适用场景:

  • 客户不需要知道要使用的对象的创建过程
  • 客户使用的对象存在变动的可能,或者根本就不知道使用哪一个具体对象

优缺点:

  • 一旦需要增加新的功能,直接增加具体工厂和具体产品就可以了,不需要修改之前的代码。
  • 增加新产品的同时需要增加新的工厂,导致系统类的个数成对增加,一定程度上增加了系统复杂性。

应用:

  • java.util.Calendar
  • java.text.NumberFormat

抽象工厂模式:

  • 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

  • 一个抽象工厂类,可以派生出多个具体工厂类。

  • 每个具体工厂类可以创建多个具体产品类的实例。

  • 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。

  • 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

  • 设计模式——六大原则和创建型模式_第2张图片

适用场景:

  • 系统中有多个产品族,而系统一次只能消费其中一族产品
  • 同属于同一个产品族的产品一起使用

优缺点:

  • 新增产品族很方便,只需要增加一个具体工厂即可。
  • 但如果要增加新产品等级结构,就需要修改抽象工厂和所有具体工厂类,这种性质被称为 开闭原则 的倾斜性。

单例模式:

在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。

单例模式的实现有懒汉式(线程不安全)、饿汉式(线程安全,一开始就直接实例化),静态内部类实现等。

静态内部类实现:
使用内部类来维护单例的实现,JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。这样当我们第一次调用getInstance的时候,JVM能够帮我们保证instance只被创建一次,并且会保证把赋值给instance的内存初始化完毕,避免出现 JVM 具有指令重排的特性。

public class Singleton {
 
	/* 私有构造方法,防止被实例化 */
	private Singleton() {
	}
 
	/* 此处使用一个内部类来维护单例 */
	private static class SingletonFactory {
		private static Singleton instance = new Singleton();
	}
 
	/* 获取实例 */
	public static Singleton getInstance() {
		return SingletonFactory.instance;
	}
 
	/* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */
	public Object readResolve() {
		return getInstance();
	}

建造者模式:

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。
主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

如Java中的StringBuilder类的实现就是应用这种模式。

原型模式:

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

关键代码:实现克隆操作,在 JAVA 实现 Cloneable,重写 clone();

优点:

  • 性能提高。
  • 逃避构造函数的约束。

缺点:

  • 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
  • 必须实现 Cloneable 接口。

参考资料:

  • 《设计模式》清华大学出版社刘伟主编
  • 菜鸟教程

你可能感兴趣的:(设计模式)