第二章《Java 设计模式之工厂模式》静态工厂模式 工厂方法

工厂模式

简单工厂模式(也叫静态工厂模式)

简介

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

UML类图

未完待续。。。

角色

  • 抽象产品(接口或抽象类)
  • 具体产品(继承或者实现都行)
  • 工厂类(通过循环条件来new 哪个具体产品)

例子(以+-*/为例)

  1. 抽象产品
public abstract class Operation {

    public abstract float getResult(float firstNumber, float secondNumber);

}
  1. 具体产品
public class SubOperation extends Operation {
    @Override
    public float getResult(float firstNumber, float secondNumber) {
        return firstNumber-secondNumber;
    }
}
public class MulOperation extends Operation {
    @Override
    public float getResult(float firstNumber, float secondNumber) {
        return firstNumber*secondNumber;
    }
}
public class DivOperation extends Operation {
    @Override
    public float getResult(float firstNumber, float secondNumber) {
        return firstNumber/secondNumber;
    }
}
  1. 工厂类
public class OperationFactory {

    public static Operation getOperation(String quotaFlag){
        Operation o = null;
        // 通过条件判断类来决定哪个产品
        switch (quotaFlag){
            case "+" :  o = new AddOperation();
            case "-" :  o = new SubOperation();
            case "*" :  o = new MulOperation();
            case "/" :  o = new DivOperation();
            default:break;
        }
        return o;
    }
}
  1. 应用程序
public class Computer {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("请输入第一个数字:");
        float firstNum  = in.nextFloat();
        System.out.println("请输入第二个数字:");
        float secondNum  = in.nextFloat();
        System.out.println("请输入运算符号:");
        String countQuato = in.next();
        System.out.println(count(firstNum,secondNum,countQuato));
    }
    private static float count(float firstNum,float secondNum , String countQuota){
    //通过工厂类获取对象
        Operation operation = OperationFactory.getOperation(countQuota);
        return operation.getResult(firstNum,secondNum);
    }
}

缺点

产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一种新型车,都要在工厂类中增加相应的创建业务逻辑,这显然是违背开闭原则。

工厂方法模式

简介

简单工厂模式虽然解决了解耦问题。但如果要增加某个产品的时候,工厂类就必须对里面的条件进行修改。违反了对扩展开发,对修改关闭的原则。因此必须把工厂再抽象化出来。当有产生新产品的时候,就新建一个新的工厂来实现它。

角色

  • 抽象产品
  • 很多个具体产品
  • 抽象工厂
  • 很多个工厂
  • 控制生产

例子(同样以加减乘除为例)

产品不变.和上面的相同。
1. 抽象工厂

public interface IFractory {
    public Operation generateOper();
}
  1. 具体工厂
public class AddOperationFactory implements IFractory{

    @Override
    public Operation generateOper() {
        return new AddOperation();
    }
}
public class SubOperationFactory implements IFractory {
    @Override
    public Operation generateOper() {
        return new SubOperation();
    }
}

….
3. 应用程序

IFractory fractory = new AddOperationFactory();
Operation operation = fractory.generateOper();
operation.getResult(firstNum,secondNum);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值