java设计模式(工厂模式)

简言:

java有二十三种设计模式,面试时几乎面试官都会问你知道哪些设计模式,单例模式,装饰模式,工厂模式,外观模式,建造者模式,适配器模式等等,不单单面试中需要你的了解渗透,在实际开发中也是大有用途的。今天主要说的是工厂模式,会以案例的形式讲解。

简单理解什么是工厂:

简单说,就是到底要实例化谁,会不会增加实例化对象,所以要用一个单独的类做这个创建实例的过程,就是工厂;

今天主要讲解分为三部分:

1.什么是简单工厂模式

2.什么是工厂方法模式

3.两者之间的对比(优缺点)

我们今天通过“计算器” 功能对工厂模式进行讲解:

一。简单工厂模式

工厂类代码:

public class OperationFactory {

    public static Operation createOperatie(String operate) {
        Operation oper = null;
        switch (operate) {
            case "+":
                oper = new OperationAdd();
                break;
            case "-":
                oper = new OperationSub();
                break;
            case "*":
                oper = new OperationMul();
                break;
            case "/":
                oper = new OperationDiv();
                break;

        }
        return  oper;
    }

}

客户端实现:

/**
     * 简单工厂模式
     * */
    private void initUI() {
        Operation oper = OperationFactory.createOperatie("+");
        oper.setNumA(1);
        oper.setNumB(2);
        double v = oper.GetResult();
        Toast.makeText(FactoryActivity.this, "结果为:" + v, Toast.LENGTH_SHORT).show();
    }

通过代码我们能看出,只要输入运算符号,工厂就实例出合适的对象,通过多态反馈给父类实现的结果;

如果我们添加复杂的运算,比如立方根等,我们添加运算的子类就够了,在工厂类中添加分支,就能实现。

我将功能运算类分享给大家(计算加减乘除类)

/**
 * 计算加法类 并返回结果
 * */
public class OperationAdd extends Operation {


    @Override
    public double GetResult() {
        double result = 0;
        result = this.getNumA() + this.getNumB();
        return result;
    }
}

/**
 * 计算减法类 并返回结果
 * */
public class OperationSub extends Operation{

    @Override
    public double GetResult() {
        double result = 0;
        result = this.getNumA() - this.getNumB();
        return result;
    }
}

/**
 * 计算乘法类 并返回结果
 * */
public class OperationMul extends Operation {

        @Override
        public double GetResult() {
            double result = 0;
            result = this.getNumA() *  this.getNumB();
            return result;
        }
}


/**
 * 计算除法类并返回结果
 * */
public class OperationDiv extends Operation {
    @Override
    public double GetResult() {
        double result = 0;
        if (this.getNumB() == 0) {
            return 0;
        } else {
            result = this.getNumA() / this.getNumB();
            return result;
        }

    }
}

二.工厂方法模式

步骤:

1.创建一个工厂接口,运算类分别实现该接口

/**
 * 创建一个工厂接口
 * */
public interface IFatory {
    Operation CreateOperation();
}

2.运算类建一个具体工厂去实现这个接口

/**
 * 创建一个加法工厂,实现工厂接口
 * */
public class AddFatory implements IFatory {
    @Override
    public Operation CreateOperation() {
        return new OperationAdd();
    }
}


/**
 * 创建一个减法工厂,实现工厂接口
 * */
public class SubFactory implements IFatory {
    @Override
    public Operation CreateOperation() {
        return new OperationSub();
    }
}

/**
 * 创建一个除法工厂,实现工厂接口
 * */
public class DivFactory implements IFatory {
    @Override
    public Operation CreateOperation() {
        return new OperationDiv();
    }
}


/**
 * 创建一个乘法工厂,实现工厂接口
 * */

public class MulFactory implements IFatory {
    @Override
    public Operation CreateOperation() {
        return new OperationMul();
    }
}

在客户端实现功能得到结果:


    /**
     * 工厂方法模式
     * */
    private void initUI2() {
        IFatory operFactory = new AddFatory();
        Operation operation = operFactory.CreateOperation();
        operation.setNumA(3);
        operation.setNumB(5);
        double v = operation.GetResult();
        Toast.makeText(FactoryActivity.this, "结果为:" + v, Toast.LENGTH_SHORT).show();
    }

三: 简单工厂 VS 工厂方法

他们的区别所在,简单工厂模式的最大优点就在于工厂类中包含了必要的逻辑判断,根据客户端的选择动态的实例化相关的类,

对于客户端来说,祛除了与产品的依赖

当时如果加入一个立方根功能。我们要在运算的工厂类方法中添加case 分支,相当于对外扩展开放了,对修改也开放了,违背了

开放--封闭原则;这个时候我们选择了工厂方法:

两者的结构图:

          

总结:

工厂方法约束了简单工厂违背的开放-封闭原则的缺点,又保持了封装对象创建过程的优点。它们都是集中封装了对象的创建,更换对象时,不需要大的改动,降低了客户程序与产品对象的耦合,工厂方法模式就是简单工厂模式的进一步的优化,由于使用了多态性,保持了简单工厂模式的优点,克服了缺点;

发布了96 篇原创文章 · 获赞 370 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/wk_beicai/article/details/100170118