当前位置: 首页 > news >正文

设计模式~简单工厂模式

 

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

工厂模式专门负责将大量有共同接口的类实例化。

工厂模式的几种形态

  • 简单工厂模式(Simple Factory):又称静态工厂方法模式
  • 工厂方法模式(Factory Method):又称多态性工厂模式或虚拟构造子模式
  • 抽象工厂模式(Abstract Factory): 又称工具箱模式

 简单工厂模式的结构

 从上图可以看出,简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色等三个角色:

  • 工厂类角色(Creator): 担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体的java类实现。
  • 抽象产品角色(Product): 担任这个角色的类是由工厂方法模式所创建的对象的父类,或他们共同拥有的接口。抽象产品角色可以用一个java接口或者java抽象类实现。
  • 具体产品角色(Concrete Product): 工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体java类实现。

工厂类的示意性源代码:

Creator类的源代码:

public class Creator {

    public static Product factory(){
        return new ConcreteProduct();
    }
}

抽象角色Product接口的源代码:

public interface Product {

}

具体角色ConcreteProduct类的源代码:

public class ConcreteProduct implements Product {

    public ConcreteProduct(){}
}

简单工厂模式就是由一个工厂类根据传入的参数决定创建出哪一种产品类的实例。

简单工厂模式的优点和缺点

 优点

模式的核心是工厂类。这个类含有必要的判断逻辑,可以决定在什么时候创建哪个产品类的实例。

而客户端则可以免除直接创建产品对象的责任,而仅仅负责消费产品。

简单工厂模式通过这种做法实现了对责任的分割。

缺点:

当产品类有负责的多层等级结构时,工厂类只有它自己。以不变应万变,就是模式的缺点。

这个工厂类集中了所有产品的创建逻辑,形成一个无所不知的全能类。它需要对所有的产品负责,如果它一旦不能工作,使用到这些产品的地方就都不能工作了。

另一个缺点,当产品类有不同的接口种类时,工厂类需要判断在什么时候创建某种产品。这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展时较为困难。这一缺点在工厂方法模式中得到克服。

再者,由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构。这一缺点会在工厂方法中得到克服。

总结一下就是三个缺点:

  1. 会造成程序对该工厂类的强依赖,一旦工厂类出现问题,整个程序都受影响。
  2. 当工厂类有不同接口种类时,将来进行功能扩展会变的困难。
  3. 工厂角色无法形成继承的等级结构。

相关文章:

  • 羊没羊,好像也没那么重要了!
  • C语言必背18个经典程序
  • UG/NX二次开发Siemens官方NXOPEN实例解析—2.6 CreateNote
  • 斯坦福联合Meta提出多模态模型RA-CM3,检索增强机制或成文本图像领域新制胜法宝
  • Mit6.006-problemSession03
  • 高通Ride软件开发包使用指南(12)
  • 回调函数的基本使用
  • 艾美捷内皮血管生成检测试剂盒的多种特点
  • Java反射介绍
  • 【Spring专题】「开发指南」夯实实战基础功底之解读logback-spring.xml文件的详解实现
  • vue.config.js configureWebpack 对象和函数两种使用方法
  • 记录我の秋招之旅【23届 CV算法岗】
  • IHRM0728 项目参数化框架
  • 搜遍全网,终于找到了报表自动化的最佳工具,比Excel好用10倍
  • python自定义包实例
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • ➹使用webpack配置多页面应用(MPA)
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • angular学习第一篇-----环境搭建
  • CAP理论的例子讲解
  • CSS 专业技巧
  • gulp 教程
  • java正则表式的使用
  • Java知识点总结(JavaIO-打印流)
  • Linux gpio口使用方法
  • Quartz初级教程
  • Ruby 2.x 源代码分析:扩展 概述
  • Shell编程
  • Wamp集成环境 添加PHP的新版本
  • 初识 webpack
  • 分类模型——Logistics Regression
  • 机器学习中为什么要做归一化normalization
  • 如何在 Tornado 中实现 Middleware
  • 算法-图和图算法
  • 我感觉这是史上最牛的防sql注入方法类
  • 智能合约Solidity教程-事件和日志(一)
  • 自定义函数
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • #if #elif #endif
  • (2)nginx 安装、启停
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Sublime Text3配置Lua运行环境
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .bat批处理(六):替换字符串中匹配的子串
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET Core Web APi类库如何内嵌运行?
  • .net core 依赖注入的基本用发
  • .NET 设计一套高性能的弱事件机制
  • .NET处理HTTP请求
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @RequestMapping用法详解
  • [ 隧道技术 ] cpolar 工具详解之将内网端口映射到公网