Java 重构 & 设计模式

2022-06-24  本文已影响0人  bowen_wu

重构 Refactor

对软件的内部结构进行的调整

优点

原则

方法

设计模式

单例模式 Singleton

在整个 JVM 中只存在某个类的一个实例 => 这个实例或对象是全局的,不可变的,唯一的

public class MySingleton {
    private static MySingleton instance = null;

    private MySingleton {
    }

    public static MySingleton getInstance() {
        if (instance == null) { // 多线程并发问题 => 两个线程各自创建一个 => 在单个线程内只有一个实例
            instance = new MySingleton();
        }
        return instance;
    }
}

public class World {
    // public static final World SINGLETON_INSTANCE = new World();
    private static final World SINGLETON_INSTANCE = new World();

    public static World getInstance() {
        return SINGLETON_INSTANCE;
    }

    private World() {
    }
}

工厂模式 Factory

根据传入的参数动态产生出相应的产品

静态工厂模式

  1. 使用静态工厂方法代替构造器
  2. 当使用静态工厂方法时,把构造器私有化 => private Cat() {} => 封装 => 使用者只能通过使用静态工厂方法进行创建实例,之后构造器内部的细节可以随意更改,只要对外接口不变外界就不需要改动代码
优点
缺点

抽象工厂模式

建造者模式 Builder

//  使用 builder 的静态工厂方法
person  = PersonBuilder.createPerson()
                .withFirstName("")
                .withLastName("")
                .withAddress("")
                .build();

代理模式 Proxy

适配器模式 Adapter

装饰器模式 Decorator

// DataService interface

// DateServiceImpl class

// Main.java

// LogDecorator class

// CacheDecorator class

适合场景

  1. 面向接口
  2. 每个 Decorator 都需要写重复的代码 => AOP 解决这个问题

享元模式 Flyweight

组合模式

模板模式

// 模板方法
public class BookWriter {
    public void writeBook() {
        writeTitle();
        writeContent();
        writeEnding();
    }

    public void writeTitle() {
        System.out.println("标题");
    }

    public void writeContent() {
        System.out.println("内容");
    }

    public void writeEnding() {
        System.out.println("谢谢大家");
    }
}

// 实现 => 多态
public class MyBookWriter extends BookWriter {
    public static void main(String[] args) {
        new MyBookWriter().writeBook();
    }

    @Override
    public void writeTitle() {
        // 如果想在模板的 writeTitle 方法中添加自己的方法
        super.writeTitle();
        System.out.println("My Title!");
    }

    // 覆盖模板的部分 => writeEnding
    @Override
    public void writeEnding() {
        // 如果想在模板的 writeEnding 方法中添加自己的方法
        System.out.println("Thank everyone!");
    }
}

策略模式

class User {
    private boolean vip;

    public boolean isVip() {
        return vip;
    }
}

class PriceCalculator {
    public int calculate(DiscountStrategy discountStrategy, int price, User user) throws IllegalAccessException {
        return discountStrategy.discount(price, user);

//        switch (strategy) {
//            case "NoDiscount":
//                return price;
//            case "95":
//                return (int) (price * 0.95);
//            case "VIP":
//                if (user.isVip()) {
//                    return (int) (price * 0.85);
//                }
//                return (int) (price * 0.95);
//            // ...
//            default:
//                throw new IllegalAccessException();
//    }
    }
}

class DiscountStrategy {
    public int discount(int price, User user) {
        return price;
    }
}

class NoDiscountStrategy extends DiscountStrategy {
    @Override
    public int discount(int price, User user) {
        return price;
    }
}

class Discount95Strategy extends DiscountStrategy {
    @Override
    public int discount(int price, User user) {
        return (int) (price * 0.95);
    }
}

class VipDiscountStrategy extends DiscountStrategy {
    @Override
    public int discount(int price, User user) {
        if (user.isVip()) {
            return (int) (price * 0.85);
        }
        return (int) (price * 0.95);
    }
}

门面模式 Facade

知识点

  1. 《重构改善既有代码的设计》Martin Fowler
  2. TODO: search 多线程 + 双锁检测 单例模式
上一篇下一篇

猜你喜欢

热点阅读