博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单工厂、工厂、抽象工厂的对比
阅读量:2499 次
发布时间:2019-05-11

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

本文只讲解3中模式的对比,不讲解详情

简单工厂模式

核心方法: 工厂类的CreateOperation(String),让其通过多态创造相应实例

优点: 增加各种复杂的运算时,工厂类可以封装变化,让客户端更加方便的实现运算功能。

缺点: 违背开放-封闭原则

使用场景: 比如实现运算功能的时候,需求可能会很多,很容易变化。

在这里插入图片描述

工厂模式

简单工厂模式中的工厂类与分支耦合,那么根据依赖倒置原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有要生产具体类的工厂,就去实现这个接口,这样一个简单工厂模式的工厂类,变成了一个工厂抽象接口多个具体生产对象的工厂。于是,当要新增“求m的n次方”的时候,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了。

优点:

  • 只是扩展变了变化,符合开方-封闭原则。工厂方法克服了简单工厂违背开方-封闭原则的缺点
  • 降低了客户端和产品对象的耦合。工厂方法是简单工厂的进一步抽象和推广。

缺点:

  • 客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的。即,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。
  • 由于新增一个产品时,就需要增加一个产品工厂的类,增加了额外的开发量。
    在这里插入图片描述

抽象工厂

提供一个创建一系列相关相互依赖的接口,而无需指定它们具体的类。

优点: 易于交换产品系列,这是最大的优点。例如IFactory factory=new AccessFactory(),只在初始化的时候出现一次,这样改变一个应用的具体工厂变得很容易,只需要改变具体工厂即可使用不同的产品配置。如果现在要改变数据库访问,只需要修改具体工厂就行了

  • 让具体的创建过程和客户端分离,客户端是通过它们的抽象接口操纵实例产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。

  • 开放-封闭原则依赖倒转原则的良好运用。其实,这一点和工厂模式一样。

缺点: 如果要增加一个Project项目表(一个系列),至少要添加3个类,IProject,SqlServerProject,AccessProject,还需要修改IFactory,SqlServerFactory,AccessFactory,极不方便。用反射+抽象工厂解决。


工厂模式和抽象工厂模式的区别

  • 工厂模式 适合具体功能类ConcreteProductX只有一个系列的情况,例如只有一个User类和User操作类的时候。
  • 抽象工厂模式 适合一个具体功能类ConcreteProductX有至少两个系列的情况,现在有很多表,而sql server和access又是不同的分类,抽象工厂模式 适合解决涉及到多个产品系列的问题
    在这里插入图片描述

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

你可能感兴趣的文章
【2020-3-21】Mac安装Homebrew慢,解决办法
查看>>
influxdb 命令行输出时间为 yyyy-MM-dd HH:mm:ss(年月日时分秒)的方法
查看>>
已知子网掩码,确定ip地址范围
查看>>
判断时间或者数字是否连续
查看>>
docker-daemon.json各配置详解
查看>>
Docker(一)使用阿里云容器镜像服务
查看>>
Docker(三) 构建镜像
查看>>
Spring 全家桶注解一览
查看>>
JDK1.8-Stream API使用
查看>>
cant connect to local MySQL server through socket /tmp/mysql.sock (2)
查看>>
vue中的状态管理 vuex store
查看>>
Maven之阿里云镜像仓库配置
查看>>
Maven:mirror和repository 区别
查看>>
微服务网关 Spring Cloud Gateway
查看>>
SpringCloud Feign的使用方式(一)
查看>>
SpringCloud Feign的使用方式(二)
查看>>
关于Vue-cli+ElementUI项目 打包时排除Vue和ElementUI
查看>>
Vue 路由懒加载根据根路由合并chunk块
查看>>
vue中 不更新视图 四种解决方法
查看>>
MySQL 查看执行计划
查看>>