【设计模式】21-28:单例模式、桥接模式、命令模式、职责链模式、中介者模式、享元模式、解释器模式、访问者模式

二十一、单例模式

确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

主要解决:一个全局使用的类频繁地创建与销毁。

public class SingleObject {
 
   //创建 SingleObject 的一个对象
   private static SingleObject instance = new SingleObject();
 
   //让构造函数为 private,这样该类就不会被实例化
   private SingleObject(){}
 
   //获取唯一可用的对象
   public static SingleObject getInstance(){
      return instance;
   }
 
   public void showMessage(){
      System.out.println("Hello World!");
   }
}

具有多种实现方式:

线程安全的懒汉式、线程不安全的懒汉式、饿汉式(上述例子)、双重校验锁(DCL,即 double-checked locking)、静态内部类、枚举

懒汉式:对象为空就实例化

线程安全:synchronized 修饰该方法

双重校验锁:volatile变量+synchronized

二十二、桥接模式

抽象部分与实现部分分离,使其可以独立变化

提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

使用场景:一个类存在两个独立变化的维度,且这两个维度都需要进行扩展

二十三、命令模式

请求以命令的形式包裹在对象中,并传给调用对象。

意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

public class CommandPatternDemo {
   public static void main(String[] args) {
      Stock abcStock = new Stock();
 
      BuyStock buyStockOrder = new BuyStock(abcStock);
      SellStock sellStockOrder = new SellStock(abcStock);
 
      Broker broker = new Broker();
      broker.takeOrder(buyStockOrder);
      broker.takeOrder(sellStockOrder);
 
      broker.placeOrders();
   }
}

二十四、职责链模式

多个对象都能处理请求

为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦

初始化设定级别,及对应的方法

通过级别编号进行方法的传递

 

二十五、中介者模式

该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

场景:多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息。

 

 二十六、享元模式

主要用于减少创建对象的数量,以减少内存占用和提高性能。

主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

应用实例: 1、JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。 2、数据库的数据池。

 

 

final HashMap<String, Shape> 存储不同颜色对应的圆

二十七、解释器模式

给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。 

应用实例:编译器、运算表达式计算。

使用switch  case根据传入字符串进行解析

 

二十八、访问者模式

使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变

posted @ 2022-01-14 11:46  哥们要飞  阅读(52)  评论(0编辑  收藏  举报