0
点赞
收藏
分享

微信扫一扫

HBase 超大表迁移、备份、还原、同步演练手册:全量快照 + 实时同步(Snapshot + Replication)不停机迁移方案

腊梅5朵 2023-12-26 阅读 44

 摘要

背景

开发面临哪些问题(痛点)?

代码需具备哪些特性(需求)?

tips:如何学习设计模式?

总体原则

单一职责

开放-封闭原则

依赖倒置原则

里氏替换原则

tips:实现总体原则的方法论:24个设计模式

23 种设计模式详解(全23种) - 知乎

简单工厂模式

 需求举例

 分析

Java实现

抽象操作符父类

public abstract class Operation {
    private double numberA = 0;
    private double numberB = 0;

/**省略get和set方法*/
    public double getResult(){
        return 0;
    }
}

加法子类

public class AddOperation extends Operation{
    @Override
    public double getResult(){
        return super.getNumberA() + super.getNumberB();
    }
}

简单工厂类

public class OperationFactory {
    public static Operation createOperation(String opr){
        Operation operation = null;
        switch (opr){
            case "+":
                operation = new AddOperation();
                break;
            default:
        }
        return operation;
    }
}

客户端调用

 public static void main(String[]args){
        Operation opr ;
        opr = OperationFactory.createOperation("+");
        opr.setNumberA(1);
        opr.setNumberB(2);
        System.out.println(opr.getResult());
    }

扩展新功能

扩展减法子类

public class SubOperation extends Operation{
    @Override
    public double getResult(){
        return super.getNumberA() - super.getNumberB();
    }
}

修改简单工厂类

    public static Operation createOperation(String opr){
        Operation operation = null;
        switch (opr){
            case "+":
                operation = new AddOperation();
                break;
            case "-"://添加减法类
                operation = new SubOperation();
                break;
            default:

        }
        return operation;
    }

存在的问题?

策略模式

Java实现

策略接口

public interface IStrategy {
    double algorithm(double money);
}

业务策略1

public class CashReturn implements IStrategy{
    private double moneyCondition = 0.d;
    private double moneyReturn  = 0.d;
    public CashReturn(double moneyCondition,double moneyReturn){
        this.moneyCondition = moneyCondition;
        this.moneyReturn = moneyReturn;
    }
    @Override
    public double algorithm(double money) {
        if(money > moneyCondition){
            return money - Math.floor( money/moneyCondition) * moneyReturn;
        }
        return money;
    }
}

业务策略2

public class CashRebate implements IStrategy{
    private double rebate = 1d;

    public CashRebate(double rebate){
        this.rebate = rebate;
    }

    @Override
    public double algorithm(double money) {
        return money*rebate;
    }
}

策略上下文类

public class CashContext {
    IStrategy strategy;
    public CashContext(String type){
        switch (type){
            case "discount":
                strategy = new CashRebate(0.8);
                break;
            case "return":
                strategy = new CashReturn(200,30);
                break;
            default:
        }
    }

    public double getResult(double money){
        return strategy.algorithm(money);
    }
}

client调用

    public static void main(String[]args){
        double inputMoney = 100;
        String type = "discount";
        //1.简单工厂方法:类型为参数通过工厂方法返回不同计算对象,对象计算最终值。
        //client需要使用工厂类  +  不同计算类
        //2.类型作为参数,通过上下文对象,直接获取最终值。将不同计算对象封装入上下文对象。
        //client只需要使用上下文类。
        double outputMoney = new CashContext(type).getResult(inputMoney);
        System.out.println(outputMoney);
    }

简单工厂和策略模式区别

工厂方法模式

需求举例 

Java实现

操作符父类

public abstract class IOperation {
    public double numA = 0;
    public double numB = 0;
    abstract double getResult();
}

加法子类

public class AddOperation extends IOperation{
    public AddOperation(double numA,double numB){
        super.numA = numA;
        super.numB = numB;
    }
    @Override
    public double getResult() {
        return numA + numB;
    }
}

工厂方法接口

public interface IFactory {
    IOperation createOperation(double numA,double numB);
}

加法工厂子类

public class AddFactory implements IFactory{
    @Override
    public IOperation createOperation(double numA,double numB) {
        return new AddOperation(numA,numB);
    }
}

客户端调用

public static void main(String[]args){
        IOperation opr = new AddFactory().createOperation(1,3);
        System.out.println(opr.getResult());
    }

扩展新功能

减法子类

public class SubOperation extends IOperation{
    public SubOperation(double numA,double numB){
        super.numA = numA;
        super.numB = numB;
    }
    @Override
    public double getResult() {
        return numA - numB;
    }
}

减法工厂子类

public class SubFactory implements IFactory{
    @Override
    public IOperation createOperation(double numA,double numB) {
        return new SubOperation(numA,numB);
    }
}

优缺点

满足开放封闭原则

 业务扩展产生过多工厂子类

简单工厂与工厂方法区别

抽象工厂模式

 需求举例

 分析

Java实现

user、department接口和实现

//接口定义
public interface IUserService {
    User getUser();
}

//Access实现
public class AccessUser implements IUserService {
    @Override
    public User getUser() {
        System.out.println("访问access get user");
        return null;
    }
}

//Sqlserver实现
public class SqlserverUser implements IUserService {
    @Override
    public User getUser() {
        System.out.println("访问Sqlserver get user");
        return null;
    }
}
//接口定义
public interface IDepartmentService {
    Department getDepartment();
}

//Access实现
public class AccessDepartment implements IDepartmentService {
    @Override
    public Department getDepartment() {
        System.out.println("访问access get department");
        return null;
    }
}
//Sqlserver实现
public class SqlserverDepartment implements IDepartmentService {

    @Override
    public Department getDepartment() {
        System.out.println("访问Sqlserver get department");
        return null;
    }
}

优化简单工厂类

public class DataAccessFactory {
//根据变量的值,选择Access或Sqlserver方式访问数据库。该值可以写入配置文件中,更加方便
    String dbAccessMethod = "test.factory.abstfactory.impl.access.";
    public IUserService createUserService() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        String className =dbAccessMethod + "AccessUser";
        Class clazz = Class.forName(className);
        return  (IUserService) clazz.getDeclaredConstructor().newInstance();
    }

    public IDepartmentService creteDeparmentService() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        String className =dbAccessMethod + "AccessDepartment";
        Class clazz = Class.forName(className);
        return (IDepartmentService) clazz.getDeclaredConstructor().newInstance();
    }
}

  client调用

public static void main(String[]args) throws ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        DataAccessFactory dataAccess = new DataAccessFactory();

        IUserService userService = dataAccess.createUserService();
        userService.getUser();

        IDepartmentService departmentService = dataAccess.creteDeparmentService();
        departmentService.getDepartment();
    }

优缺点

抽象工厂总结 

觉得不错,点个👍吧,(*^▽^*)

举报

相关推荐

0 条评论