工厂模式总述

工厂模式(简单工厂模式、工厂模式、抽象工厂模式) “在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。”,这句话应该是工厂模式的高度概括。该模式用于封装和管理对象的创建,是一种创建型模式。 一、工厂模式的分类: 根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂抽象程度可分为工厂方法模式和抽象工厂模式。 1. ... 阅读详情

 工厂模式属于类的创建模式,工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,而不必事先知道每次要实例化哪一个类。工厂模式有三个基本形态:

1. 简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method
Pattern)。
2. 工厂方法(Factory Method)模式,又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式。
3. 抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或Toolkit)模式。
我们用图例来理解简单工厂模式的基本语义。(以下所有图示只是理解的代表形式,为了表达清楚,在某些方面可能违背建模图示法中的基本语义)。
 


图1

简单工厂模式的掌握,对学习单例模式和多例模式起着非常重要的作用。
图1表示农场的水果种植情况,很明显,我们可知:Fruit接口类有三个方法(plant,harvest,grow);由于Apple和Grape类实现了Fruit接口,所以必须实现Fruit类中所有的方法,其中Apple 和Grape各自有相关的方法。至于他们之间的关系,代码我就不列出。
农场的园丁(FruitGardener )也是系统的一部分,自然要由一个合适的类来代表。这个类就是FruitGardener 类,FruitGardener 类会根据客户端的要求,创建出不同的水果对象,比如苹果(Apple)、葡萄(Grape)的实例。而如果接到不合法的要求,FruitGardener 类会抛出BadFruitException 异常。
/*********************以下为农场的园丁类*********************/
public class FruitGardener
{
/**
* 静态工厂方法
*/
public static Fruit factory(String which) throws BadFruitException
{
if (which.equalsIgnoreCase("apple"))
{
return new Apple();
}
else if (which.equalsIgnoreCase("grape"))
{
return new Grape();
}
else
{
throw new BadFruitException("Bad fruit request");
}
}
}
 
/*********************以下为自定义异常类*********************/
public class BadFruitException extends Exception
{
public BadFruitException(String msg)
{
super(msg);
}
}
 
 
/*********************用户调用*********************/
………………
try
{
FruitGardener.factory("grape");
FruitGardener.factory("apple");
FruitGardener.factory("xxx");
}
catch(BadFruitException e)
{
...
}
…………………
 
由此可见, 简单工厂涉及到三个角色:
1. 工厂类角色:负责创建产品的对象。如上面的FruitGardener类。它是工厂方法模式的核心。它往往由一个具体的类实现。
2. 抽象产品角色:实现了产品的共同接品,它可以由抽象类或接口实现。如上面的Fruit
3. 具体的产品:某一具体的产品,如上面的Apple和Grape
 
注意
1. 厂方法的中的工厂角色也可以由抽象产品角色扮演。即抽象产品角色担任了对象的创建。在java API中如:java.text.DateFormat 此时,抽象产品角色被定义成一个抽象的类,而不是一个接口。(抽象类与接口之间的区别与应用,在后面我会继续列出相关内容)。一个抽象类不能有自己的实例, DateFormat 的工厂方法是静态方法,并不是普通的方法。也就是说,它直属于类本身,不通过类的实例化。

图2
2. 如果抽象产品角色被省略,则工厂角色可以与具体产品角色合并。
public class FruitGardener
{
public FruitGardener (){}
/**
* 静态工厂方法
*/
public static FruitGardener factory()
{
return new FruitGardener ();
}
}
 
以上两点类似单例模式和多类模式,但不等于单例或多例模式。在后面模式设计中,会提到它,先别急。这是简单工厂模式的一种退化现象。如下代码:
 
简单工厂模式与其它模式的关系
1. 与单例模式的关系
单例模式使用了简单工厂模式。换言之,单例类具有一个静态工厂方法提供自身的实例。一个抽象产品类同时是子类的工厂。(如图2所示)
但是单例模式并不是简单工厂模式的退化情形,单例模式要求单例类的构造方法是私有的,从而客户端不能直接将之实例化,而必须通过这个静态工厂方法将之实例化,而且单例类自身是自己的工厂角色。换言之,单例类自己负责创建自身的实例。单例类使用一个静态的属性存储自己的惟一实例 ,工厂方法永远仅提供这一个实例。(说到这里,我简单有点兴奋,终于知道 Sun提供的javaAPI中为什么会采用这些模式 )
  2. 与多例模式的关系
  多例模式是对单例模式的推广。多例模式与单例模式的共同之处在于它们都禁止外界直接将之实例化,同时通过静态工厂方法向外界提供循环使用的自身的实例。它们的不同在于单例模式仅有一个实例,而多例模式则可以有多个实例。
多例模式往往具有一个聚集属性,通过向这个聚集属性登记已经创建过的实例达到循环使用实例的目的。一般而言,一个典型的多例类具有某种内部状态,这个内部状态可以用来区分各个实例;而对应于每一个内部状态,都只有一个实例存在。
注 :聚集表示类之间的关系是整体与部分的关系,它分:共享聚集和组成;共享聚集中的部分可以是多个整体的一部分;而组成 仅 表示整体与部分关系,整体消失,则部分也消失。需要注意的是 ,一些面向对象大师对聚集的定义并不一样。
其它理解多例模式,并不困难,我们可以通过javaAPI来理解,尤其是聚集关系。
根据外界传入的参量,工厂方法可以查询自己的登记聚集,如果具有这个状态的实例已经存在,就直接将这个实例提供给外界;反之,就首先创建一个新的满足要求的实例,将之登记到聚集中,然后再提供给客户端。
关于单例模式和多例模式详细的细节,在后面会描述。
3. 备忘录模式
单例和多例模式使用了一个属性或者聚集属性来登记所创建的产品对象, 以便可以通过查询这个属性或者聚集属性找到和共享已经创建了的产品对象。这就是备忘录模式的应用。
4. MVC 模式
MVC 模式并不是严格意义上的设计模式,而是在更高层次上的架构模式。 MVC 模式可以分解成为几个设计模式的组合,包括合成模式、策略模式、观察者模式,也有可能会包括装饰模式、调停者模式、迭代子模式以及工厂方法模式等。
简单工厂模式所创建的对象往往属于一个产品等级结构,这个等级结构可以是MVC模式中的视图(View);而工厂角色本身可以是控制器(Controller)。一个MVC 模式可以有一个控制器和多个视图,如下图所示。

图3
我们结合简单工厂方法,可知上图中的Controller(控制器)也就是工厂角色,(FruitGardener)它负责创建产品View(视图)。如果系统需要有多个控制器参与这个过程的话,简单工厂模式就不适用了,应当考虑使用工厂方法模式,我们以后描述它。
 
简单工厂方法的应用
使用静态工厂方法是为了将具体子类实例化的工作隐藏起来,从而客户端不必考虑如何将具体子类实例化,因为抽象类DateFormat 会提供它的合适的具体子类的实例。这是一个简单工厂方法模式的绝佳应用。
利用具体产品类的超类类型将它的真实类型隐藏起来,其好处是提供了系统的可扩展性。如果将来有新的具体子类被加入到系统中来,那么工厂类可以将交给客户端的对象换成新的子类的实例,而对客户端没有任何影响。
这种将工厂方法的返还类型设置成抽象产品类型的做法,叫做针对抽象编程,这是依赖倒转原则(DIP)的应用。我们后面会描述“依赖倒转原则(DIP)”的具体应用。
 
该模式的缺点
大家不难看出,如果新增加产品如:orange,则需要修改工厂类(FruitGardener),从而限制了其灵活性;而对于产品角色类适合,因此简单工厂只在有限的程度上支持“开–闭”原则。
工厂类集成了所有的创建工作,显得工厂类负任比较得,万一出问题,所有的创建工作将不能进行。当产品类有不同的接口种类时,工厂类需要判断在什么时候创建某种产品。这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展时较为困难。这一缺点在工厂方法模式中得到克服。
由于简单工厂模式使用静态方法作为工厂方法,而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构。这一缺点会在工厂方法模式中得到克服。
 

  好了,关于工厂模式中的简单工厂模式就描述到这,下一节,主要描述工厂模式中的工厂方法。

SystemRDL:从寄存器描述到自动化生成的完整指南 本文详细介绍了SystemRDL如何通过“一份描述,多处生成”的理念,彻底解决芯片与FPGA设计中手动维护寄存器带来的不一致与低效问题。文章提供了从语言快速上手、核心组件讲解到使用PeakRDL工具链实现自动化代码与文档生成的完整实战指南,帮助硬件工程师构建高效、可靠的寄存器开发流程。 阅读详情

相关推荐

Frida实战:高效dump Android内存中的so文件与修复技巧

本文详细介绍了使用Frida工具dump Android内存中已解密so文件的实战技巧。针对加固应用静态分析失效的痛点,文章提供了从环境搭建、使用frida_dump脚本自动化抓取内存数据,到利用SoFixer工具修复ELF文件结构的完整流程,帮助逆向分析人员高效获取可分析的so文件。

tt34567的博客 527

工厂方法模式(简单工厂模式)

工厂模式是一种创建型设计模式,用于创建对象。它的主要目的是通过将从代码中抽象出来,从而使代码更加灵活和可维护。通过使用工厂模式,我们可以避免在代码中直接实例化对象,而是将对象创建的任务委托给一个专门的工厂类来处理。在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的。

qq_53868937的博客 694

3D Slicer:从入门到精通(二)——入门指南

本篇文章包含开始使用3D Slicer所需的信息,包括如何安装和快速开始使用基本功能,以及在哪里找到更多信息。

walt3433的博客 2万+

创建型模式(一):工厂方法模式(含简单工厂模式)

工厂方法(FactoryMethod)模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”,它不属于 GoF 的 23 种经典[设计模式],它的缺点是增加新产品时会违背“开闭原则”。

kayyoo的博客 2421

保姆级教程 | MS构建三层石墨后转成LAMMPS的data文件

喜欢的话记得一键三连~

baguette的博客 2951

Android 13.0仿ios的hotseat效果修改hotseat样式

在13.0系统产品rom定制化开发中,在项目需求的需要,系统原生Launcher的布局样式很一般,所以需要重新设计ui对布局样式做调整,产品在看到 ios的hotseat效果觉得特别美观,所以要仿ios一样不需要横屏铺满的效果 居中显示就行了,所以就要看hotseat的具体布局显示了

安卓兼职framework和app工程师的博客 1144

简单工厂模式

文章目录工厂模式简介定义简单工厂模式的结构图 工厂模式简介 定义 简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。 简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,要的是统一的接口。 简单工厂模式的结构图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/...

记录求学阶段的技术学习、项目实践与成长思考。 542

一文学会python基础知识

1. python 运行环境 1.1 脚本式环境 1.2 交互式环境 2. python 注释 3. 变量及变量命名 4. 关键词 BIFS 5. 标准操作符 6. 条件判断 7. 循环 8. python 数据类型 9. python 序列 9.1 序列-字符串(str) 9.2 序列-列表 9.3 序列-元组 10. 字典 11. 集合 12. python内存管理及可变、不可变对象 13. 函数 13.1 函数参数 13.2 return and yiled(生成器) 13.3 参数传递处理 ...

weixin_43178406的博客 26万+

简单工厂、工厂方法、抽象工厂的区别

简单工厂模式(Simple Factory Pattern)简单工厂模式又称静态工厂方法模式,是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式的核心思想就是有一个专门的类来负责创建实例的过程。工厂角色(Factory Role):是简单工厂模式的核心,负责创建所有的类的内部逻辑。工厂类必须能够被外界调用,创建所需要的产品对象。抽象产品角色(Abstract Product Role)

huaqianzkh的专栏 1909

学习笔记:TF卡启动荔枝派Nano(全志F1C200S)

荔枝派Nano编译Kernel报错报错内容如下编译烧录 报错内容如下 No controllers found No ethernet found. 从这些报错我真没看从出啥问题,也是在网上找,说是没有找到flash,是因为淘宝买的板子更换了flash,需要在u-boot里面重新适配型号: 板子的型号为xt25f128,但是实际u-boot的配置里面不是需要重新更改: u-boot/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts &spi0 { pin

热爱科技,物联,程序开发等 2133

SAPGUI 与 ADT 的时代分野:在多云架构下,谁还能代表现代 SAP 开发

摘要(149字) SAP开发工具正经历代际更迭:SAPGUI基于专有协议(NI/DIAG)的厚客户端架构难以适配多云环境,而ADT(ABAP Development Tools)通过HTTP(S)协议和Eclipse生态成为ABAP Cloud/RAP开发的唯一入口。关键差异体现在:ADT支持CDS、行为定义等云原生对象建模,天然对齐BTP的零信任网络;集成ATC、Git等DevOps工具链;而SAPGUI无法创建RAP核心对象,在跨平台、自动化方面存在硬限制。官方文档明确将ADT作为Clean Core战

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 388

【创建型模式】工厂方法模式

简单工厂模式又叫做静态工厂方法模式。目的:定义一个用于创建对象的接口。实质:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。简单工厂模式基本实现流程1.具体产品类:将需要创建的各种不同产品对象的相关代码封装到具体产品类中;2.抽象产品类:将具体产品类公共的代码进行抽象和提取后封装在一个抽象产品类中;3.工厂类:提供一个工厂类用于创建各种产品,在工厂中提供一个创建产品的工厂方法,该方法可以根据所传入参数的不同创建不同的具体产品对象。4.

Emily的博客 1332

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

工厂模式及什么时候用工厂模式

在设计模式中,Factory   Method也是比较简单的一个,但应用非常广泛,EJB,RMI,COM,CORBA,Swing中都可以看到此模式的影子,它是最重要的模式之一.在很多地方都会看到xxxFactory这样命名的类     Factory  Method是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.当一个类无法预料要创建哪种类的对象或是一个

人工智能的专栏 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

什么是工厂模式

  创建型设计模式中的工厂模式可以细分为三种:分别是简单工厂模式、工厂方法模式、抽象工厂模式。下面通过一些例子更加形象的理解工厂上述三种模式。 简单工厂模式 定义:在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。   简单工厂模式属于类的创建型模式,又叫做静态工厂模式。通过专门定义一个工厂类来负责创建其它类的实例,被创建的实例通常都具有共同的父类。需要注意的是,简单工厂模式并不...

深度学习炼丹炉 3547

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

简单工厂模式、工厂模式以及抽象工厂模式

工厂方法模式:工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。一、简单工厂模式:实例化对象的时候不再使用 new Object()形式,可以根据用户的选择条件来实例化相关的类。对于客户端来说,去除了具体的类的依赖。只需要给出具体实例的描述给工厂,工厂就会自动返回具体的实例对象。具体实现如下:1. 定义一个操作接口:}2. 定义具体的操作类:// 加法计算}}// 减法计算。

m0_51797179的博客 797

工厂模式及简单的工厂模式详解

工厂模式 实现了创造者和调用者的分离 核心本质 实例化对象用工厂方法代替new操作 将选择实现类。创建对象统一管理和控制。从而将调用者跟我们的实现类解耦 详细分类 简单工厂模式 用来生产同一等级结构中的任意产品。(对于增加新的产品,需要修改已有代码) 工厂方法模式 用来生产同一等级结构中的固定产品。(支持增加任意产品) 抽象工厂模式 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力,支持...

蔡茂的博客 1115

简单工厂模式 工厂模式 抽象工厂模式

三种工厂模式比较 简单工厂模式:专门定义一个类来创建其他类的示例,被创建的实例通常有相同的父亲 工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实例化延迟到子类 抽象工厂模式:提供一个创建一系列相关或者相互依赖的接口,或无需指定他们具体的类 简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23...

?.?的专栏 607

工厂模式

java三种工厂模式1.简单工厂模式2.反射之简单工厂模式3.工厂方法模式4.抽象工厂模式 1.简单工厂模式 需求分析: 使用简单工厂模式模拟买手机buyPhone( ).如果传入参数 smartphone,则返回一个Phone对象表示购买成功. package DesignPattern; //抽象行为买手机buyPhone() interface Phone { void buy...

iqqcode 561

工厂模式:简单工厂模式,工厂方法模式,抽象工厂模式

工厂模式关心的重点不是过程而是结果,需要把过程隐藏起来 1.简单工厂模式: 1.1首先要有一个产品接口 定义的是一个标准: package com.thp.factory; // 产品接口 // 汽车需要满足一定的标准 public interface Car { // 规定汽车的品牌 String getName(); } 1.2各种各样的产品实现这个接口 ...

汤小萌的博客 413

工厂模式总结——三个工厂

工厂模式总结——三个工厂

weixin_43301424的博客 618

工厂模式 工厂方法模式 抽象工厂模式 简单工厂模式 工厂模式于抽象工厂的区别 设计模式

工厂模式 定义一个用于创建对象的接口,让子类实现具体类的创建。工厂将类的实例化延迟的子类。 良好的分装性。对于具体产品,只要知道产品名称即可(类名或字符串),封闭了对产品创建的细节。 屏蔽具体产品类。通过抽象产品接口,屏蔽了各个具体产品的实现细节。使用者只关心产品接口就行。比如,java中JDBC的模式,可以很方便的从mysql切换到Oracle。 工厂方法模式,是典型的解耦框架。高层模块只需要知道产品的抽象类,符合迪米特法则。也符合依赖倒置原则,只依赖产品抽象类。也符合里氏替换原则,使用产品子类替换父产

自强博客 284

设计模式-工厂模式(简单工厂模式、工厂模式、抽象工厂模式)

工厂模式 前提 开发者创造的实体类代码并不会提供给客户端,只是开放了一个接口,即工厂类。客户端在获取系统中的对象的时候,只能通过工厂类来获取对象(即使用者除了工厂类和一些简单条件,对其余代码一无所知。) 定义 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 分类 简单工厂模式(Simple Factory Pattern):又叫作静态工厂方法模式(Static Factory Method Pattern),有一个具体

hfx_fmxd的博客 350

工厂模式 | 简单工厂模式、工厂模式、抽象工厂模式

工厂模式: 它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 步骤: 创建一个接口: Shape 创建实现接口的实体类: Rectangle /Square /Circle 创建一个工厂,生成基于给定信息的实体类的对象。ShapeFactory 使用该工厂,通过传递类型信息来获取实体类的对象。 class Shape { public: virtual void draw() = 0 ; }; class

专注于C/C++/Linux领域创作 394

简单工厂模式、工厂模式和抽象工厂模式的区别

迅速回顾三种工厂模式,通过类图快速回忆三者的实现

qq_37366618的博客 1534

工厂模式--从无工厂模式到工厂模式的变化

简单工厂 定义 在创建一个对象时,不向客户暴露内部细节,并提供一个创建对象的通用接口 类图 简单工厂把实例化的操作单独放到一个类中,这个类就称为简单工厂类,让简单工厂类来就决定应该用哪个具体子类来实例化。 这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。客户类往往有多个,如果不使用简单工厂,那么素偶又的客户类都要知道所有子类的细节。而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。 简单工厂在JDK的应用 JDK中的Calendar使用了简单工厂

weixin_44293582的博客 310
上一篇: 实现基于Android的英文词典
下一篇: Java正则表达式详解
QGJava
博客等级 码龄16年 14粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值