博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模式2. 工厂方法模式-Java
阅读量:4033 次
发布时间:2019-05-24

本文共 3022 字,大约阅读时间需要 10 分钟。

1.简单工厂模式的缺点:

简单工厂的最大优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。

但是当新增类的时候,需要在工厂类中添加新的分支条件,也就是需要修改原有的类。违背了开放-封闭原则。

2.什么是工厂方法模式

  • 定义一个用于创建对象的接口,让子类决定实例化哪一个类。

  • ​ 既然简单工厂的工厂类与具体对象的分支耦合, 那么就对它下手,根据依赖倒转原则,我们把工厂类
抽复出—个接口。这个接口只有—个方法,就是创建抽象产品的工厂方法。然后,所有的要生产具体类
的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂,于是我们要增加’求 M 数的 N 次方’的功能时,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了。从而保证了工厂和产品体系都没有修改的变化而只是扩展的变化,完全符合了开放封闭原则。

  • 仍然存在的弊端

    工厂方法模式实现时,客户端需要决定实例化哪—个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。想要加功能,本来是改工厂类的,而现在是修改客户端。

  • 工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。

  • 简单工厂和工厂方法模式都是集中封装了对象的创建,要更换对象时,不需要做大的改动就可以实现,降低了客户程序和产品对象的耦合。

  • 工厂方法时简单工厂模式的进一步抽象和推广,由于使用了多态性,工厂方法模式保持了简单工厂的优点,并且克服了其缺点。但是缺点是每加一个产品就需要增加一个产品工厂的类,增加了额外的开发量。

  • 至于工厂方法这个需要客户端选择哪个工厂类的问题,可以用反射解决。

在这里插入图片描述

3.计算器小程序使用工厂方法模式

产品父类(计算器父类)

package com.factorymethod.entity;public class Operation {
private double numberA=0; private double numberB=0; public double getNumberA() {
return numberA; } public double getNumberB() {
return numberB; } public void setNumberA(double numberA) {
this.numberA = numberA; } public void setNumberB(double numberB) {
this.numberB = numberB; } public double getResult(){
double result=0; return result; }}

产品子类1(加法类)

package com.factorymethod.entity;public class OperationAdd extends Operation {
@Override public double getResult() {
double result=0; result=getNumberA()+getNumberB(); return result; }}

产品子类2(减法类)

package com.factorymethod.entity;public class OperationSub extends  Operation{
@Override public double getResult() {
double result=0; result=getNumberA()-getNumberB(); return result; }}

工厂类接口

package com.factorymethod.factory;import com.factorymethod.entity.Operation;public interface Factory {
public Operation createOperation(); //注意这里}

产品子类1具体工厂(加法类工厂)

package com.factorymethod.factory;import com.factorymethod.entity.Operation;import com.factorymethod.entity.OperationAdd;public class AddFactory implements Factory {
@Override public Operation createOperation() {
return new OperationAdd(); }}

产品子类2具体工厂(减法类工厂)

package com.factorymethod.factory;import com.factorymethod.entity.Operation;import com.factorymethod.entity.OperationSub;public class SubFactory implements Factory{
@Override public Operation createOperation() {
return new OperationSub(); }}

客户端

package com.factorymethod.client;import com.factorymethod.entity.Operation;import com.factorymethod.factory.AddFactory;import com.factorymethod.factory.Factory;public class Client {
public static void main(String[] args) {
Factory factory=new AddFactory(); //这里需要客户端选择,是缺点 Operation operation=factory.createOperation(); //这里继承了简单工厂的优点,实现了产品对象的封装 operation.setNumberA(3.5); operation.setNumberB(5.7); double res=operation.getResult(); System.out.println("计算结果"+res); }}

转载地址:http://apfdi.baihongyu.com/

你可能感兴趣的文章
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(五):Image的各种姿势
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
adb command not found
查看>>
Xcode 启动页面禁用和显示
查看>>
Decode Ways
查看>>
Plus One
查看>>
Subsets
查看>>
Subsets II
查看>>
Maximum Subarray
查看>>
Add Binary
查看>>
Rotate List
查看>>
Search in Rotated Sorted Array
查看>>
Insertion Sort List
查看>>
Partition List
查看>>
Climbing Stairs
查看>>
Minimum Path Sum
查看>>