java的简单工厂模式_java 简单工厂模式

简单工厂

工厂是一种创建型的设计模式,常用于封装变化,一般遵循那里有变化就封装那里的原则。

简单工厂模式又 叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

39796f91683135614e20ef9acd26093c.png

以一个java面试题为例 --> 使用java实现一个计算机控制台程序,要求输入数的运算,得到结果。

下面是题目最原始的做法。

public classComputer {public static voidmain(String[] args) {

Scanner in= newScanner(System.in);

System.out.println("请输入第一个数字:");float firstNum =in.nextFloat();

System.out.println("请输入第二个数字:");float secondNum =in.nextFloat();

System.out.println("请输入运算符号:");

String countQuato=in.next();if("+".equals(countQuato)){

System.out.println("result : "+(firstNum+secondNum));

}else if("-".equals(countQuato)){

System.out.println("result : "+(firstNum-secondNum));

}else if("*".equals(countQuato)){

System.out.println("result : "+(firstNum*secondNum));

}else if("/".equals(countQuato)){

System.out.println("result : "+(firstNum/secondNum));

}

}

上面的写法实现虽然简单,但是却没有面向对象的特性,代码拓展性差,显然不是出题者想要考察的意图。

(工厂模式一般遵循那里有变化就封装那里的原则),在面向对象编程语言中,一切都是对象,所以上面 运算符号(既然这里有变化那么我们就进行封装)  也应当作对象来处理。

定义一个接口

public interfaceOperation {float getResult(float one,floattwo);

}

把符号当做对象处理,实现Operation接口

public class addOperation implementsOperation {//加法

@Overridepublic float getResult(float one,floattwo) {return one +two;

}

}

public class SubtractOperation implementsOperation {//减法

@Overridepublic float getResult(float one, floattwo) {return one -two;

}

}

使用简单工厂模式实现根据不同的情况创建不同的对象。

public classOperationFactory {public staticOperation getOperation(String operator){switch(operator){case "+":return newaddOperation();case "-":return newSubtractOperation();default:break;

}return null;

}

}

调用:

public static voidmain(String[] args) {

Operation operation= OperationFactory.getOperation("+");

System.out.println(operation.getResult(10000, 10000));

}

结果:

20000.0

这里 我们以一位同学去买水果为示例

定义一个买的接口

//买水果的接口

public interfaceIFruits {voidbuy();

}

创建实现接口的实体类

public class Apple implementsIFruits {

@Overridepublic voidbuy() {

System.out.println("欢迎来购买苹果,^_^ ");

}

}

public class Banana implementsIFruits {

@Overridepublic voidbuy() {

System.out.println("欢迎来购买香蕉,^_^ ");

}

}

创建学生类

public classStudent {public static voidmain(String[] args) {

//让其子类自已决定实例化哪一个类

IFruits banana= newBanana();banana.buy();

}

}

运行结果:

欢迎来购买香蕉,^_^

从Student类中,可以看到学生只能够买香蕉。如果需要买苹果就需要new Apple()....

所以 new Banana() 就是一个变化点,既然是变化点,那么我们进行封装。

创建一个水果店。

public classFruitsShop {public staticIFruits getFruit(String fruitName){switch(fruitName){case "Apple":return newApple();case "Banana":return newBanana();default:throw new IllegalArgumentException("没有你想要的"+fruitName+"水果");

}

}

}

修改学生类里面的代码

public classStudent {public static voidmain(String[] args) {

System.out.print("你好,你想买什么水果呢?");

Scanner in= newScanner(System.in);

IFruits fruit=FruitsShop.getFruit(in.next());

fruit.buy();

}

}

运行结果:

你好,你想买什么水果呢?Banana

欢迎来购买香蕉,^_^

到这里,我们就已经实现了一个简单工厂模式。

简单工厂特点:

优点:

1、一个调用者想创建一个对象,只要知道其实现类名称就可以了。

2、扩展性高,如果想增加一个产品,只要扩展一个接口实现类就可以。

3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:

1、FruitsShop代码跟IFruit代码紧耦合。

2、每次要添加/删除/修改 都要需要改FruitsShop这个类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值