1.工厂模式
    简而言之,就是创建一个工厂来产生对象。
    步骤:

    1. 定义一个接口

      1. public interface Shape {
      2. void draw();
      3. }
    2. 定义接口的实现

      1. public class Rectangle implements Shape {
      2. @Override
      3. public void draw() {
      4. System.out.println("Inside Rectangle::draw() method.");
      5. }
      6. }
      1. public class Square implements Shape {
      2. @Override
      3. public void draw() {
      4. System.out.println("Inside Square::draw() method.");
      5. }
      6. }
      1. public class Circle implements Shape {
      2. @Override
      3. public void draw() {
      4. System.out.println("Inside Circle::draw() method.");
      5. }
      6. }
    3. 创建工厂来生成实体对象

      1. public class ShapeFactory {
      2. //使用 getShape 方法获取形状类型的对象
      3. public Shape getShape(String shapeType){
      4. if(shapeType == null){
      5. return null;
      6. }
      7. if(shapeType.equalsIgnoreCase("CIRCLE")){
      8. return new Circle();
      9. } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
      10. return new Rectangle();
      11. } else if(shapeType.equalsIgnoreCase("SQUARE")){
      12. return new Square();
      13. }
      14. return null;
      15. }
      16. }
    4. 使用工厂来返回实体类对象

      1. public class FactoryPatternDemo {
      2. public static void main(String[] args) {
      3. ShapeFactory shapeFactory = new ShapeFactory();
      4. //获取 Circle 的对象,并调用它的 draw 方法
      5. Shape shape1 = shapeFactory.getShape("CIRCLE");
      6. //调用 Circle 的 draw 方法
      7. shape1.draw();
      8. //获取 Rectangle 的对象,并调用它的 draw 方法
      9. Shape shape2 = shapeFactory.getShape("RECTANGLE");
      10. //调用 Rectangle 的 draw 方法
      11. shape2.draw();
      12. //获取 Square 的对象,并调用它的 draw 方法
      13. Shape shape3 = shapeFactory.getShape("SQUARE");
      14. //调用 Square 的 draw 方法
      15. shape3.draw();
      16. }
      17. }

    2. 抽象工厂模式
    通过一个抽象工厂,来创造工厂,再通过创造出来的工厂生成对象,例子略。

    3.单例模式
    步骤:

    1. 构造方法私有化
    2. 创建当前类的一个静态成员变量
    3. 创建一个获取成员变量的方法
    1. public class SingleObject {
    2. //创建 SingleObject 的一个对象
    3. private static SingleObject instance = new SingleObject();
    4. //让构造函数为 private,这样该类就不会被实例化
    5. private SingleObject(){}
    6. //获取唯一可用的对象
    7. public static SingleObject getInstance(){
    8. return instance;
    9. }
    10. public void showMessage(){
    11. System.out.println("Hello World!");
    12. }
    13. }
    • 懒汉式,线程不安全:

      1. public class Singleton {
      2. private static Singleton instance;
      3. private Singleton (){}
      4. public static Singleton getInstance() {
      5. if (instance == null) {
      6. instance = new Singleton();
      7. }
      8. return instance;
      9. }
      10. }
    • 懒汉式,线程安全:

      1. public class Singleton {
      2. private static Singleton instance;
      3. private Singleton (){}
      4. public static synchronized Singleton getInstance() {
      5. if (instance == null) {
      6. instance = new Singleton();
      7. }
      8. return instance;
      9. }
      10. }
    • 饿汉式,线程安全,但容易产生垃圾对象:

      1. public class Singleton {
      2. private static Singleton instance = new Singleton();
      3. private Singleton (){}
      4. public static Singleton getInstance() {
      5. return instance;
      6. }
      7. }
    • 双检锁/双重校验锁,线程安全且在多线程下能保持高性能:

    volatile关键字参考这篇博客:https://www.cnblogs.com/zhengbin/p/5654805.html

    1. public class Singleton {
    2. private volatile static Singleton singleton;
    3. private Singleton (){}
    4. public static Singleton getSingleton() {
    5. if (singleton == null) {
    6. synchronized (Singleton.class) {
    7. if (singleton == null) {
    8. singleton = new Singleton();
    9. }
    10. }
    11. }
    12. return singleton;
    13. }
    14. }
    • 登记式/静态内部类,这种方式与双检锁功效一致,实现更简单,应使用这种方式而不是双检锁方式。

    静态内部类在使用时才会加载
    静态代码块在类加载的时候加载
    一般顺序:

    1. 先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关
    2. 执行子类的静态代码块和静态变量初始化
    3. 执行父类的实例变量初始化
    4. 执行父类的构造函数
    5. 执行子类的实例变量初始化
    6. 执行子类的构造函数

    如果类已经被加载:
    则静态代码块和静态变量就不用重复执行,在创建类对象时,只执行与实例相关的变量初始化和构造方法。

    1. public class Singleton {
    2. private static class SingletonHolder {
    3. private static final Singleton INSTANCE = new Singleton();
    4. }
    5. private Singleton (){}
    6. public static final Singleton getInstance() {
    7. return SingletonHolder.INSTANCE;
    8. }
    9. }
    • 枚举,线程安全,实现容易

    这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。

    1. public enum Singleton {
    2. INSTANCE;
    3. public void whateverMethod() {
    4. }
    5. }

    4.建造者模式
    使用简单的对象一步一步构建成一个复杂的对象,这种类型的设计模式属于创建型模式,他提供了以重创建对象的最佳方式。

    5.适配器模式