大话设计模式 —— 工厂方法模式、抽象工厂模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shida_csdn/article/details/82011286

一、模式介绍

       工厂方法模式使用多态代替简单工厂模式中的分支判断(switch-case)

       即采用不同的工厂生产不同的产品,而不是一个工厂生产所有产品

       需要什么产品,客户端首先要获得对应的工厂,不同工厂需要实现同一个公共的的工厂抽象接口

       采用工厂方法模式的优势是:增加产品后,无需修改原来的简单工厂分支判断了,而是通过拓展一个工厂类实现

       也即:对修改关闭,对扩展开放(其实也不是完全关闭了修改,只是这个修改移到客户端部分了)

       工厂方法模式在扩展时需要:实现新产品以及对应的工厂

       简单工厂模式在扩展时需要:实现新产品,同时修改原来工厂的分支判断,把新产品加进去

       抽象工厂模式:就是工厂方法模式上的简单扩展,工厂生产一系列产品,而不是一个

       优势是方便通过切换工厂,变更所有产品

       抽象工厂模式典型的可以应用于数据库切换

二、使用工厂方法模式实现计算器

       我们依然复用大话设计模式 —— 简单工厂模式的代码

       包括 Operation 接口 、AddOperation、SubOperation、DefaultOperation 

       然后,我们编写一个工厂抽象接口

public interface OperationFactory {
    
    Operation getOperation();

}

       分别针对不同类别计算,实现对应的工厂方法

public class AddFactory implements OperationFactory{

    @Override
    public Operation getOperation() {
        return new AddOperation();
    }

}

 public class SubFactory implements OperationFactory{

    @Override
    public Operation getOperation() {
        return new SubOperation();
    }

}

       测试类,先获取对应工厂,然后生产对应产品

public class Main {

    public static void main(String[] args) {

        OperationFactory factory = new AddFactory();  // 加法工厂
        Operation opt = factory.getOperation();  // 加法工厂生产的是加法运算操作
        System.out.println(opt.compute(1, 2));
        factory = new SubFactory();  // 减法工厂
        opt = factory.getOperation(); // 减法工厂生产的是减法运算操作
        System.out.println(opt.compute(1, 2));
    }

}

=========

特别补充:

工厂方法模式和抽象工厂模式,在客户端存在大量关于创建具体工厂的代码,这也给维护带来了难度

因此,可以把工厂的创建过程使用简单工厂模式再封装下,编写一个生产工厂的工具类,比如 OperationFactoryProvider

该类内部可以基于配置文件配置创建合适的工厂(switch-case),

更高级地可以使用反射创建工厂对象(这样就不用 switch-case 了,又前进了一步 ^_^)

Hibernate 等框架的数据库切换我想可能就是基于这种思想吧!

猜你喜欢

转载自blog.csdn.net/shida_csdn/article/details/82011286