首页 > 编程语言 > 详细

Java常用设计模式(精简)

时间:2020-06-16 17:13:46      阅读:69      评论:0      收藏:0      [点我收藏+]

话不多说奔主题,精神抖擞就是干!

 

Java中共包含23种设计模式,大致分为三种类型:
1. 创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。

2. 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。

3. 行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式。

 

下面介绍常用的几种:

1. 单例模式:是个程序一般都会用到这个模式。比如日志类,整个项目工程可能只需要创建一次,重复创建也只是返回第一次创建的实例的引用。

public class SingleTon {

  //快加载

  private static final SingleTon singleTon = new SingleTon();

  private SingleTon() {};

  public static SingleTon GetInstance() { return singleTon; }

}

public class SingleTon {

  private static volatile SingleTon singleTon = null;

  private SingleTon() {};

  //懒加载

  public static SingleTon GetInstance() {

    if (null == singleTon) {

      synchronized (SingleTon.class) {

        if (null == singleTon) {

          singleTon = new SingleTon();

        }

      }

    }

    return singleTon;

   }

}

*要点:构造函数私有化,new前判空加锁。

 

2. 工厂模式:集中化生产同一类产品(存在差异化),比如造车厂,我可能只造小轿车,但是小轿车可能有不同的颜色搭配,还有经济型、标准型、豪华型等性能搭配。

2.1 简单工厂

public class Car {

  public Color color;  //颜色

  public Car (Color color) { this.color = color; }

}

public class PianYiCar extends Car {

  public PianYICar(Color color) { super.color = color; }

}

public class XiaoZiCar  extends Car {

  public XiaoZiCar  (Color color) { super.color = color; }

}

public class GuiCar  extends Car {

  public GuiCar  (Color color) { super.color = color; }

}

public class CarFactory {

  public Car Create(Type type, Color color) {

    switch(type) {

      case ‘经济型‘: return new PianYiCar (color);

      case ‘标准型‘: return new XiaoZiCar  (color);

      case ‘豪华型‘: return new GuiCar(color);

      default: return new Car(color);

    }

  }

}

*要点:简单工厂,其实就是条件工厂,根据不同条件去创建同一类型的差异化对象。

 

2.2 工厂方法:定义一个工厂类该类定义了一些标准方法但没有具体实现,通过不同的子类继承这个工厂父类并实现其标准方法去创造相同(存在差异化)或不同类型的对象。

public  abstract class CarFactory {

  public abstract Car CreateCar(Color color);

}

public class PianYiCarFactory {

  @Override

  public Car CreateCar(Color color) {new PianYiCar(color); }

}

public class XiaoZiCarFactory {

  @Override

  public Car CreateCar(Color color) {new XiaoZiCar(color); }

}

public class GuiCarFactory {

  @Override

  public Car CreateCar(Color color) {new GuiCar(color); }

}

*要点:具体实施的工作不再由父工厂去完成,父工厂定义了行业标准,而子工厂根据老大说的标准,各自去完成自己的事情。

 

3. 适配器模式

3.1 类适配器

先讲个小故事。大家在日常生活里,有没有遇到过这种情况,我的手机快没电了想要充电,但是手头只有一个二插头的充电器和一个三插头的插线板,woc,怎么办?好急啊!在线等~

那这种情况下我们是不是可以采取一些极端手段,比如把二插头的充电器的两只腿掰弯,这样是不是就能插进三插头的插线板里充电了呢?哈哈哈,没错,我真是个天才!

public Interface TwoChong {

  public void  TwoChongDian();

}

public Interface ThreeChong {

  public void  ThreeChongDian();

}

public class TwoChongImpl implements TwoChong {

  @Override

  public void TwoChongDian() { System.out.println("充电"); }

}

//下面这个就是你掰弯后的二插头充电器了^-^

public class TwoChongImplEx extends TwoChongImpl implements ThreeChong {

  @Override

  public void ThreeChongDian() { super.TwoChongDain(); }

}

*要点:其实说白了,就是对现有功能的一种扩展。

 

3.2 对象适配器:它是对类适配器的一种衍生,因为类适配具有强绑定、强约束性,不方便扩展。

public class ThreeChongImpl implements ThreeChong {

  private TwoChongImpl twoChongImpl = null;

  public ThreeChongImpl(TwoChongImpl twoChongImpl) { this.twoChongImpl = twoChongImpl; }

  @Override

  public  void ThreeChongDian() { twoChongImpl.TwoChongDian(); }

}

 

3.3 接口适配器:减少代码量,提高可读性。

 public interface A {

  public void Do();

}

public class AA implements A {

  @Override

  public void Do() {}

}

public class AAA extends AA {

  @Override

  public void Do() { System.out.println("实际工作"); }

}

 

4. 代理模式:代理模式分为三种,静态代理,JDK动态代理,CGLIB动态代理。代理模式是Spring中面向切面编程的核心。

4.1 静态代理

public interface Wo {

  public void Travel();

}

public class WoImpl implements Wo {

  @Override

  public void Travel() { Sysyem.out.println("去旅行"); }

}

public class MyProxyImpl implements Wo {

  private WoImpl woImpl = null;

  public MyProxyImpl(WoImpl woImpl) { this.woImpl = woImpl; } 

  @Override

  public void Travel() {

    Sysyem.out.println("订去返机票");

    Sysyem.out.println("打车去机场");

    woImpl.Travel();

  }

}

*要点:所谓代理就是在你执行某个动作前后,帮你做一些准备动作和收尾动作。静态代理类只能用于一个类的代理,扩展性差。

 

4.2 JDK动态代理

public class MyProxyImpl {
  public static Wo getMyProxyByJDK(Wo wo) {
    Wo myProxy = (Wo) Proxy.newProxyInstance(wo.getClass().getClassLoader(),
      wo.getClass().getInterfaces(),
      new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

          System.out.println("订去返机票");

          System.out.println("打车去机场");

          Object obj = method.invoke(wo, args);
          return obj;
        }
      });
    return myProxy ;
  }
}

 

5. 模板方法模式

先讲个小故事。大家在日常生活里,有空的时候都会自己做点饭吃。那么今天我想做个炒饭吃,明天我想做个炒面吃。其实炒饭和炒面基本上做法是一样的,只是主要食材不一样。

那么我只要能把炒饭做好了,炒面自然不在话下。

public abstract class ChaoTemplate {

  public void Do() {

    DaoYou();

    KaiHuo();

    ReYou();

    DaoShiCai();

    FanChao();

    GuanHuo();

  }

 

  public void DaoYou() { System.out.println("倒油"); }

  public void KaiHuo() { System.out.println("开火"); }

  public void ReYou() { System.out.println("热油"); }

  public abstract void DaoShiCai();

  public void FanChao() {System.out.println("翻炒"); }

  public void GuanHuo() { System.out.println("关火"); }

}

public  class ChaoFan extends ChaoTemplate {

  @Override

  public void DaoShiCai() { System.out.println(" 倒米饭"); }

}

public  class ChaoMian extends ChaoTemplate {

  @Override

  public void DaoShiCai() { System.out.println("倒面条"); }

}

public class Test {

  public static main(String[] args) {

    ChaoFan chaoFan = new ChaoFan();

    ChaoMian chaoMian = new ChaoMian();

    chaoFan.Do();

    chaoMian.Do();

  }

}

 *要点:其实就是将相同的动作提取出来放到父类里去实现,子类实现各自的不同工作。减少重复劳动。

 

6. 策略模式:与工厂模式类似,个人感觉是将简单工厂与工厂方法结合使用的一种模式。使用时跟多态很像。

public abstract class Saler {

  public abstract void Sale();

public class PuTongSaler extends Saler {

  @Override

  public void Sale() { System.out.println("我是普通销售,我只卖袜子"); }

public class GaoJiSaler extends Saler {

  @Override

  public void Sale() { System.out.println("我是高级销售,我卖车子"); }

public class SuperSaler extends Saler {

  @Override

  public void Sale() { System.out.println("我是销售经理,你想要什么我都有"); }

}

public class MySaler {

  private Saler saler = null;

  public MySaler (Type type) {

    switch(type) {

      case ‘PuTong‘: saler = new PuTongSaler(); break;

      case ‘GaoJi‘: saler = new GaoJiSaler(); break;

      case ‘Super‘: saler = new SuperSaler(); break;

    }

  }

 

  public void Sale() { saler.Sale(); }

}

 public class Test {

  public static void main(String[] args) {

    mySaler = new MySaler(‘PuTong‘);

    mySaler.Sale();

    mySaler = new MySaler(‘GaoJi‘);

    mySaler.Sale();

    mySaler = new MySaler(‘Super‘);

    mySaler.Sale();

  }

}

 

欢迎看官儿们留言补充和指正,谢谢下次见!

Java常用设计模式(精简)

原文:https://www.cnblogs.com/chenyixun/p/13140307.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!