1 创建型模式

1.1 Builder构建者模式

定义

将⼀个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。它属于创建类模式,⼀般来说,如果⼀个对象的构建⽐较复杂,超出了构造函数所能包含的范围,就可以使⽤⼯⼚模式和Builder模式,相对于⼯⼚模式会产出⼀个完整的产品,Builder应⽤于更加复杂的对象的构建,可以只构建产品的⼀个部分,直⽩来说,就是使⽤多个简单的对象⼀步⼀步构建成⼀个复杂的对象。

例子:使用构建者模式生产电脑

主要步骤:

  1. 将需要构建的⽬标类分成多个部件(电脑可以分为主机、显示器、键盘、⾳箱等部件)
  2. 创建构建类
  3. 依次创建部件
  4. 将部件组装成⽬标对象

    1. public class Computer {
    2. private String displayer;
    3. private String mainUnit;
    4. private String mouse;
    5. private String keyboard;
    6. public String getDisplayer() {
    7. return displayer;
    8. }
    9. public void setDisplayer(String displayer) {
    10. this.displayer = displayer;
    11. }
    12. public String getMainUnit() {
    13. return mainUnit;
    14. }
    15. public void setMainUnit(String mainUnit) {
    16. this.mainUnit = mainUnit;
    17. }
    18. public String getMouse() {
    19. return mouse;
    20. }
    21. public void setMouse(String mouse) {
    22. this.mouse = mouse;
    23. }
    24. public String getKeyboard() {
    25. return keyboard;
    26. }
    27. public void setKeyboard(String keyboard) {
    28. this.keyboard = keyboard;
    29. }
    30. @Override
    31. public String toString() {
    32. return "Computer{" + "displayer='" + displayer + '\'' + ", mainUnit='"
    33. + mainUnit + '\'' + ", mouse='" + mouse + '\'' + ", keyboard='" + keyboard +
    34. '\'' + '}';
    35. }
    36. }
    1. public static class ComputerBuilder {
    2. private ComputerBuilder computer = new ComputerBuilder();
    3. public void installDisplayer(String displayer) {
    4. return computer.setDisplayer(displayer);
    5. }
    6. public void installMainUnit(String mainUnit) {
    7. return computer.setMainUnit(mainUnit);
    8. }
    9. public void installMouse(String mouse) {
    10. return computer.setMouse(mouse);
    11. }
    12. public void installKeybord(String keyboard) {
    13. return computer.setKeyboard(keyboard);
    14. }
    15. public ComputerBuilder build() {
    16. return computer;
    17. }
    18. }

    ```java public static void main(String[]args){ ComputerBuilder computerBuilder = new ComputerBuilder(); computerBuilder.installDisplayer(“显示器”); computerBuilder.installMainUnit(“主机”); computerBuilder.installKeybord(“键盘”); computerBuilder.installMouse(“⿏标”); Computer computer = computerBuilder.build(); System.out.println(computer); }

  1. <a name="Jk6XP"></a>
  2. ## 1.2 工厂模式
  3. <a name="H766B"></a>
  4. ### 简单工厂
  5. 该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象。
  6. <a name="ZrhF6"></a>
  7. #### 例子:
  8. ```java
  9. public interface Phone {
  10. void make();
  11. }
  1. public class MiPhone implements Phone {
  2. public MiPhone() {
  3. this.make();
  4. }
  5. @Override
  6. public void make() {
  7. // TODO Auto-generated method stub
  8. System.out.println("make xiaomi phone!");
  9. }
  10. }
  1. public class IPhone implements Phone {
  2. public IPhone() {
  3. this.make();
  4. }
  5. @Override
  6. public void make() {
  7. // TODO Auto-generated method stub
  8. System.out.println("make iphone!");
  9. }
  10. }
  1. public class PhoneFactory {
  2. public Phone makePhone(String phoneType) {
  3. if(phoneType.equalsIgnoreCase("MiPhone")){
  4. return new MiPhone();
  5. }
  6. else if(phoneType.equalsIgnoreCase("iPhone")) {
  7. return new IPhone();
  8. }
  9. return null;
  10. }
  11. }

工厂方法

和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂

例子:

  1. public interface AbstractFactory {
  2. Phone makePhone();
  3. }
  1. public class XiaoMiFactory implements AbstractFactory{
  2. @Override
  3. public Phone makePhone() {
  4. return new MiPhone();
  5. }
  6. }
  1. public class AppleFactory implements AbstractFactory {
  2. @Override
  3. public Phone makePhone() {
  4. return new IPhone();
  5. }
  6. }

抽象工厂方法

例子

  1. public interface PC {
  2. void make();
  3. }
  1. public class MiPC implements PC {
  2. public MiPC() {
  3. this.make();
  4. }
  5. @Override
  6. public void make() {
  7. // TODO Auto-generated method stub
  8. System.out.println("make xiaomi PC!");
  9. }
  10. }
  1. public class MAC implements PC {
  2. public MAC() {
  3. this.make();
  4. }
  5. @Override
  6. public void make() {
  7. // TODO Auto-generated method stub
  8. System.out.println("make MAC!");
  9. }
  10. }
  1. public interface AbstractFactory {
  2. Phone makePhone();
  3. PC makePC();
  4. }
  1. public class XiaoMiFactory implements AbstractFactory{
  2. @Override
  3. public Phone makePhone() {
  4. return new MiPhone();
  5. }
  6. @Override
  7. public PC makePC() {
  8. return new MiPC();
  9. }
  10. }
  1. public class AppleFactory implements AbstractFactory {
  2. @Override
  3. public Phone makePhone() {
  4. return new IPhone();
  5. }
  6. @Override
  7. public PC makePC() {
  8. return new MAC();
  9. }
  10. }

2 结构型模式

2.1 代理模式

以租房为例

  1. 首先定义一个租房接口。

    1. public interface IRentingHouse {
    2. void rentHosue();
    3. }
  2. 实现租房接口。

    1. public class RentingHouseImpl implements IRentingHouse {
    2. @Override
    3. public void rentHosue() {
    4. System.out.println("我要租用一室一厅的房子");
    5. }
    6. }

    静态代理

  3. 找中介帮我租房。

    1. public class RentingHouseProxy implements IRentingHouse {
    2. private IRentingHouse rentingHouse;
    3. public RentingHouseProxy(IRentingHouse rentingHouse) {
    4. this.rentingHouse = rentingHouse;
    5. }
    6. @Override
    7. public void rentHosue() {
    8. System.out.println("中介(代理)收取服务费3000元"); // 增强方法
    9. rentingHouse.rentHosue();
    10. System.out.println("客户信息卖了3毛钱"); // 增强方法
    11. }
    12. }
  4. 运行。

    1. public static void main(String[] args) {
    2. IRentingHouse rentingHouse = new RentingHouseImpl();
    3. RentingHouseProxy rentingHouseProxy = new RentingHouseProxy(rentingHouse);
    4. rentingHouseProxy.rentHosue();
    5. }

    动态代理

    1. JDK 动态代理

    1. /**
    2. * Jdk动态代理
    3. * @param obj 委托对象
    4. * @return 代理对象
    5. */
    6. public Object getJdkProxy(Object obj) {
    7. // 获取代理对象
    8. return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),
    9. new InvocationHandler() {
    10. @Override
    11. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    12. Object result = null;
    13. // 写增强逻辑
    14. System.out.println("中介(代理)收取服务费3000元");
    15. // 调用原有业务逻辑
    16. result = method.invoke(obj,args);
    17. System.out.println("客户信息卖了3毛钱");
    18. return result;
    19. }
    20. });
    21. }
    1. public static void main(String[] args) {
    2. IRentingHouse rentingHouse = new RentingHouseImpl(); // 委托对象---委托方
    3. // 从代理对象工厂获取代理对象
    4. IRentingHouse jdkProxy = (IRentingHouse) ProxyFactory.getInstance().getJdkProxy(rentingHouse);
    5. jdkProxy.rentHosue();
    6. }

    2. Cglib动态代理

    1. /**
    2. * 使用cglib动态代理生成代理对象
    3. * @param obj 委托对象
    4. * @return
    5. */
    6. public Object getCglibProxy(Object obj) {
    7. return Enhancer.create(obj.getClass(), new MethodInterceptor() {
    8. @Override
    9. public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    10. Object result = null;
    11. System.out.println("中介(代理)收取服务费3000元");
    12. result = method.invoke(obj,objects);
    13. System.out.println("客户信息卖了3毛钱");
    14. return result;
    15. }
    16. });
    17. }
    1. public static void main(String[] args) {
    2. RentingHouseImpl rentingHouse = new RentingHouseImpl(); // 委托对象
    3. // 获取rentingHouse对象的代理对象,
    4. // Enhancer类似于JDK动态代理中的Proxy
    5. // 通过实现接口MethodInterceptor能够对各个方法进行拦截增强,类似于JDK动态代理中的InvocationHandler
    6. // 使用工厂来获取代理对象
    7. RentingHouseImpl cglibProxy = (RentingHouseImpl) ProxyFactory.getInstance().getCglibProxy(rentingHouse);
    8. cglibProxy.rentHosue();
    9. }