设计模式

  • 什么是设计模式

软件工程中,设计模式是对软件设计中普遍存在的各种问题,所提出的 解决方案

  • 设计模式原则
  1. 开闭原则——对扩展开放,对修改封闭
  2. 里氏代换原则——任何基类出现的地方,子类都可以出现。开闭原则的补充。
  3. 依赖倒转原则——针对接口编程,高层模块不依赖底层模块,二者都依赖抽象而不依赖具体。
  4. 接口隔离原则——使用多个隔离的接口,不应使用单个庞大的接口。
  5. 单一职责原则——类的职责要单一。
  6. 迪特米原则——也称最少知道原则,一个实体与其他实体的相互作用越少越好,功能模块相对独立。
  7. 合成复用原则——多使用 组合/聚合 的方式,尽量少使用甚至不使用继承关系。
  • 工厂模式的理解

      在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

      打个比方,富士康工厂的苹果手机生产车间可以生产iPhone8和iPhone8Plus,苹果公司给出指令说要iPhone8,那工厂就生产iPhone8;给出指令说要iPhone8Plus,那工厂就生产iPhone8Plus。苹果公司的客户端,工厂是接口,生产车间是父类,生产iPhone8和iPhone8Plus的两条流水线是子类,也是具体的实现类。客户端调用接口的方法,接口里返回子类的方法。

  • 工厂模式通常分为:
  1. 普通工厂模式
  2. 多个工厂方法模式
  3. 静态工厂方法模式

大多数情况下,选用工厂方法模式,因为方法置为静态的,不需要创建实例,不需要实例化工厂类 ,可以直接调用。

  • 抽象工厂模式

抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。抽象工厂是“工厂的工厂”。

  • 工厂方法模式、抽象工厂模式区别

产品等级结构:比如一个抽象类是食物,其子类有苹果、牛奶等,则抽象食物与具体食物名称之间构成了一个产品等级结构。食物是抽象的父类,而具体的食物名称是其子类。

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如 A厨房 生产苹果、刀子,苹果属于食物产品等级结构中,而刀子则属于餐具产品等级结构中。而 B厨房 可能生成另一组产品,如牛奶、杯子。

因此工厂方法模式、抽象工厂模式最大的区别在于:

工厂方法模式:针对 一个产品等级结构。

抽象工厂模式:针对 多个产品等级结构。

  • 装饰者模式

装饰者模式(Decorator Pattern,有的也用 Wrapper Pattern)就是动态地把职责附加到已有对象上去,实现功能扩展。

Java IO 类中有一个经典的装饰者模式应用, BufferedReader 装饰了 InputStreamReader.

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
  • 观察者模式

观察者模式(Observer Pattern)就是一种 “发布者-订阅者” 的模式。也被称为 “模型-视图”模式、“源-监听者”模式。是由一个目标对象来管理所有依赖与它的观察者对象,并且当这个目标对象自身发生改变时,会主动向它的观察者们发出通知。

  • 单例模式

一个类能返回对象的一个引用(永远是同一个)和一个获得该唯一实例的静态方法(必须是静态的)。通过单例模式,可以保证系统中只有一个实例,从而在某些特定的场合下达到节约或者控制系统资源的目的。

  • 静态内部类实现单例模式
// 静态内部类

public class  Human{

    private static class HumanInnerClass{     //HumanInnerClass 是私有的,只有getHuman()才能访问实例对象

        private static final  Human human = new Human();

    }

    private Human();



    public static  Human getHuman(){    //只有调用getHuman()才会创建Human的实例对象

        return HumanInnerClass.human;

    }

}
  • 枚举实现单例模式

创建枚举默认是线程安全的,并且可以防止反序列化带来的问题。( 自由序列化,线程安全,保证单例)

public enum Human{

    INSTANCE;

    // 自定义的其他任意方法

    public void otherMethod() { }

}

可以通过Human.INSTANCE来访问实例对象。《Effective Java》里有句话:单元素的枚举类型已经成为实现Singleton的最佳方法。

原文地址:https://www.cnblogs.com/lingqinyu/p/8877767.html