WHS GIS Engineer

常用设计模式(以JAVA为例)

2019-09-19
WHS

设计模式的世界丰富多彩,比如生产一个个「产品」的工厂模式,衔接两个不相关接口的适配器模式,用不同的方式做同一件事的策略模式,构建步骤稳定、根据构建过程的不同配置构建出不同对象的建造者模式等。

设计模式一共有 23 种,可以分为构建型模式、结构型模式、行为型模式

基本原则

设计模式基于六大原则:

  • 开闭原则:一个软件实体如类、模块和函数应该对修改封闭,对扩展开放。

  • 单一职责原则:一个类只做一件事,一个类应该只有一个引起它修改的原因。

  • 里氏替换原则:子类应该可以完全替换父类。也就是说在使用继承时,只扩展新功能,而不要破坏父类原有的功能。

  • 依赖倒置原则:细节应该依赖于抽象,抽象不应依赖于细节。把抽象层放在程序设计的高层,并保持稳定,程序的细节变化由低层的实现层来完成。

  • 迪米特法则:又名「最少知道原则」,一个类不应知道自己操作的类的细节,换言之,只和朋友谈话,不和朋友的朋友谈话。

  • 接口隔离原则:客户端不应依赖它不需要的接口。如果一个接口在实现时,部分方法由于冗余被客户端空实现,则应该将接口拆分,让实现类只需依赖自己需要的接口方法。

构建型模式

  • 工厂方法模式
  • 抽象工厂模式
  • 单例模式
  • 建造型模式
  • 原型模式

    工厂模式

  • 简单工厂模式 优点: 1.调用方无需知道 Apple 、Pear 类,降低耦合 2.当Apple 、Pear 类构造变得复杂时,调用方无需关心
public class FruitFactory {
    public Fruit create(String type){
        switch (type){
            case "苹果": return new Apple();
            case "梨子": return new Pear();
            default: throw new IllegalArgumentException("暂时没有这种水果");
        }
    }
}
  • 工厂方法模式
public class AppleFactory {
    public Fruit create(){
        return new Apple();
    }
}

public class PearFactory {
    public Fruit create(){
        return new Pear();
    }
}
  • 抽象工厂方法模式
public interface IFactory {
    Fruit create();
}

public class AppleFactory implements IFactory {
    @Override
    public Fruit create(){
        return new Apple();
    }
}


public class PearFactory implements IFactory {
    @Override
    public Fruit create(){
        return new Pear();
    }
}

单例模式

单例模式非常常见,某个对象全局只需要一个实例时,就可以使用单例模式。它的优点也显而易见:

  • 它能够避免对象重复创建,节约空间并提升效率
  • 避免由于操作不同实例导致的逻辑错误

单例模式有两种实现方式:饿汉式和懒汉式。

  • 饿汉式
public class Singleton {
  
    private static Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }
}
  • 懒汉式 懒汉式解决了饿汉式的弊端,好处是按需加载,避免了内存浪费,减少了类初始化时间。
public class Singleton {
  
    private static Singleton instance = null;
  
    private Singleton() {
    }
    
    public static Singleton getInstance(){
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  • 双检锁方式 双检锁方式实现的线程安全的单例模式
public class Singleton {
    
    private static Singleton instance = null;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
  • 静态内部类方式 利用java虚拟机类加载机制实现线程安全懒汉式单例模式
public class Singleton {
    
    private static class SingletonHolder {
        public static Singleton instance = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

结构型模式

  • 适配器模式
  • 桥接模式
  • 组合模式
  • 装饰模式
  • 外观模式
  • 享元模式
  • 代理模式

参考资料

LeetCode设计模式

如何用「设计模式」制作珍珠奶茶?

详解设计模式之结构型模式(上)

枚举类实现单例模式


Comments