工厂方法模式

前言:这两天学习了简单工厂模式、工厂方法模式、抽象工厂模式,在这里详细说一下工厂方法模式。转载请注明出处:

工厂方法模式

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

  工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品。

使用的设计原则:依赖倒置原则(要依赖抽象,不要依赖具体类)。对修改关闭,对扩展开放。

类图:

 

总结:

  1、工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

  2、工厂方法,可以接受传参(称为“参数化工厂方法”),根据传入的参数不同创建不同的对象。也可以不接受传参,只产生一种对象,不需要参数化。

  3、利用字符串传参,有点危险,万一拼错,可能会造成所谓的“运行时错误”,所以避免方式为在编译时期就将参数的错误挑出来。比如:可以创建代表参数类型的对象、使用常量、枚举 enum。

缺点:

  1、由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。

举例说明:

  要求:使用面向对象实现一个计算器控制台程序,要求输入两个数字和运算符号,得到结果。

  重点:使用面向对象思想。

  使用工厂方法模式实现:

类图:

 

 抽象运算类

/**
 * 运算抽象类
 */
abstract class Operation{
    private int num1;
    private int num2;

    public int getNum1() {
        return num1;
    }

    public void setNum1(int num1) {
        this.num1 = num1;
    }

    public int getNum2() {
        return num2;
    }

    public void setNum2(int num2) {
        this.num2 = num2;
    }

    public abstract double getResult();
}

 具体运算类

/**
 * 加法运算
 */
class AddOperation extends Operation{
    @Override
    public double getResult() {
        return getNum1() + getNum2();
    }
}

/**
 * 减法运算
 */
class SubOperation extends Operation{
    @Override
    public double getResult() {
        return getNum1() - getNum2();
    }
}

/**
 * 除法运算
 */
class DivOperation extends Operation{
    @Override
    public double getResult() {
        return getNum1() / getNum2();
    }
}

/**
 * 乘法运算
 */
class MulOperation extends Operation{
    @Override
    public double getResult() {
        return getNum1() * getNum2();
    }
}

 抽象工厂类

/**
 * 抽象工厂类
 */
interface IFactory{
    Operation CreateOperation();
}

具体工厂类

/**
 * 加法工厂类
 */
class AddFactory implements IFactory{

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

/**
 * 减法工厂类
 */
class SubFactory implements IFactory{

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

/**
 * 除法工厂类
 */
class DivFactory implements IFactory{

    @Override
    public Operation CreateOperation() {
        return new DivOperation();
    }
}

/**
 * 乘法工厂类
 */
class MulFactory implements IFactory{

    @Override
    public Operation CreateOperation() {
        return new MulOperation();
    }
}

客户端

    public static void main(String[] args){
        IFactory factory = new AddFactory();
        Operation operation = factory.CreateOperation();
        operation.setNum1(1);
        operation.setNum2(2);
        System.out.println(operation.getResult());
    }

 

其他工厂模式https://www.cnblogs.com/yuxiaole/p/9276396.html

 

转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9280695.html

 

参考书籍:《Head First 设计模式》《大话设计模式》

posted @ 2018-07-08 21:05  取个名字吧  阅读(258)  评论(0编辑  收藏  举报