工厂模式

深入浅出设计模式中文版 话说十年前,有一个暴发户,他家有三辆汽车——Benz 奔驰、Bmw 宝马、Audi 奥迪, 还雇了司机为他开车。不过,暴发户坐车时总是怪怪的:上 Benz 车后跟司机说“开奔驰车!”, 坐上 Bmw 后他说“开宝马车!”,坐上 Audi 说“开奥迪车!”。你一定说:这人有病!直接说 开车不就行了?! 而当把这个暴发户的行为放到我们程序设计中来时,会发现这是一个普遍存在的现象。 幸运的是,这种有病的现象在 OO(面向对象)语言中可以避免了。下面就以 Java 语言为 基础来引入我们本文的主题:工厂模式 立即下载

文章分类:Java编程

一、引子
         话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰、Bmw宝马、Audi奥迪,还雇了司机为他开车。不过,暴发户坐车时总是怪怪的:上Benz 车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上Audi说“开奥迪车!”。你一定说:这人有病!直接说开车不就行了?!
         而当把这个暴发户的行为放到我们程序设计中来时,会发现这是一个普遍存在的现象。幸运的是,这种有病的现象在OO(面向对象)语言中可以避免了。下面就以 Java语言为基础来引入我们本文的主题:工厂模式。

二、分类
        工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

工厂模式在《Java与模式》中分为三类:
1)简单工厂模式(Simple Factory)

2)工厂方法模式(Factory Method)

3)抽象工厂模式(Abstract Factory)
         这三种模式从上到下逐步抽象,并且更具一般性。
         GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

两者皆可,在本文使用《Java与模式》的分类方法。下面来看看这些工厂模式是怎么来“治病”的。

三、简单工厂模式

简单工厂模式又称静态工厂方法模式。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。
   先来看看它的组成:

     1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

     2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

     3) 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
那么简单工厂模式怎么来使用呢?我们就以简单工厂模式来改造暴发户坐车的方式——现在暴发户只需要坐在车里对司机说句:“开车”就可以了。

Java代码 复制代码
  1. //抽象产品角色   
  2. public interface Car{   
  3.   public void drive();   
  4. }   
  5.   
  6. //具体产品角色   
  7. public class Benz implements Car{   
  8.   public void drive() {   
  9.      System.out.println("Driving Benz ");   
  10.   }   
  11. }   
  12.   
  13. public class Bmw implements Car{   
  14.   public void drive() {   
  15.    System.out.println("Driving Bmw ");   
  16.   }   
  17. }   
  18. ...(奥迪我就不写了)   
  19.   
  20. //工厂类角色   
  21. public class Driver{   
  22.         //工厂方法.注意 返回类型为抽象产品角色   
  23.          public static Car driverCar(String s)throws Exception{   
  24.                //判断逻辑,返回具体的产品角色给Client   
  25.                if(s.equalsIgnoreCase("Benz"))   
  26.                     return new Benz();   
  27.                else if(s.equalsIgnoreCase("Bmw"))   
  28.                         return new Bmw();   
  29.                              ......      
  30.                        else throw new Exception();   
  31.          ...   
  32.   
  33. //欢迎暴发户出场......   
  34. public class Magnate{   
  35.          public static void main(String[] args){   
  36.                     try{   
  37.                           //告诉司机我今天坐奔驰                        
  38.                               Car car = Driver.driverCar("benz");   
  39.                           //下命令:开车                              
  40.                               car.drive();   
  41.                     ...  
//抽象产品角色
public interface Car{
  public void drive();
}

//具体产品角色
public class Benz implements Car{
  public void drive() {
     System.out.println("Driving Benz ");
  }
}

public class Bmw implements Car{
  public void drive() {
   System.out.println("Driving Bmw ");
  }
}
...(奥迪我就不写了)

//工厂类角色
public class Driver{
        //工厂方法.注意 返回类型为抽象产品角色
         public static Car driverCar(String s)throws Exception{
               //判断逻辑,返回具体的产品角色给Client
               if(s.equalsIgnoreCase("Benz"))
                    return new Benz();
               else if(s.equalsIgnoreCase("Bmw"))
                        return new Bmw();
                             ......   
                       else throw new Exception();
         ...

//欢迎暴发户出场......
public class Magnate{
         public static void main(String[] args){
                    try{
                          //告诉司机我今天坐奔驰                     
                              Car car = Driver.driverCar("benz");
                          //下命令:开车                           
                              car.drive();
                    ...

 

将本程序空缺的其他信息填充完整后即可运行。如果你将所有的类放在一个文件中,请不要忘记只能有一个类被声明为public。本程序在jdk1.4 下运行通过。
这便是简单工厂模式了。怎么样,使用起来很简单吧?那么它带来了什么好处呢?
        首先,使用了简单工厂模式后,我们的程序不在“有病”,更加符合现实中的情况;而且客户端免除了直接创建产品对象的责任,而仅仅负责“消费”产品(正如暴发户所为)。

        下面我们从开闭原则(对扩展开放;对修改封闭)上来分析下简单工厂模式。当暴发户增加了一辆车的时候,只要符合抽象产品制定的合同,那么只要通知工厂类知道就可以被客户使用了。所以对产品部分来说,它是符合开闭原则的;但是工厂部分好像不太理想,因为每增加一辆车,都要在工厂类中增加相应的业务逻辑或者判断逻辑,这显然是违背开闭原则的。可想而知对于新产品的加入,工厂类是很被动的。对于这样的工厂类(在我们的例子中是为司机师傅),我们称它为全能类或者上帝类。
         我们举的例子是最简单的情况,而在实际应用中,很可能产品是一个多层次的树状结构。由于简单工厂模式中只有一个工厂类来对应这些产品,所以这可能会把我们的上帝累坏了,也累坏了我们这些程序员:(
        于是工厂方法模式作为救世主出现了。

Windows下快速搭建MSYS2开发环境(含GCC与MinGW配置) 本文详细介绍了在Windows系统下快速搭建MSYS2开发环境的完整流程。通过使用pacman包管理器,可以便捷地安装GCC编译器与MinGW-w64工具链,并配置系统环境变量。文章还涵盖了从基础安装、系统更新到编译开源项目的实战指南,帮助开发者高效构建原生Windows程序,显著提升C/C++开发效率。 阅读详情

相关推荐

使用nvm离线安装、管理node多版本以及配置环境变量(亲测)

使用nvm离线安装、管理node多版本以及配置环境变量(亲测)

JMHJAVA的专栏 1325

创建型模式:工厂模式(简单工厂+工厂方法+抽象工厂)

一、引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”。 你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的! 幸...

五山口老法师 545

NXP实战笔记(五):S32K3xx基于RTD-SDK在S32DS上配置ADC的硬件触发同步采样与软件采样过程

恩智浦 S32K3xx 系列汽车微控制器器件具有 15 位分辨率逐次逼近模数转换器(SAR ADC),可用于模拟输入信号的采集和数字化。-15 位的分辨率。转换数据总是15 位宽,与所选转换分辨率无关(每转换数据 14、12、10、8 个有效位,减少这个数字会加快数据转换,因为 SAR 算法的执行步骤会更少)。-每个输入通道捕获的转换数据放在单独寄存器中。-可使用“ 平均法” 提高精度,即通过计算最高 32 次转换数据的平均数来提供最终结果。-正常转换触发转换多个。

梦想技术家 3844

深入浅出设计模式

工厂模式(静态工厂模式、工厂方法模式、抽象工厂模式)   一、引子   话说十年前,有一个暴发户,他家有三辆汽车——Benz 奔驰、Bmw 宝马、Audi 奥迪,还雇了司机为他开车。不过,暴发户坐车时总是怪怪的:上 Benz 车后跟司机说“开奔驰车!”,坐上 Bmw 后他说“开宝马车!”,坐上 Audi 说“开奥迪车!”。你一定说:这人有病!直接说开车不就行了?!   而当把这个暴

一叶青天 1058

STC8G1K08A的10位PWM避坑指南:为什么你的占空比调节总失效?(附寄存器操作时序图)

本文深入剖析了STC8G1K08A单片机10位PWM功能中占空比调节失效的核心原因,揭示了数据手册未明确指出的寄存器操作时序陷阱。通过对比错误与正确配置的波形,文章指出关键在于更新占空比高2位前需临时关闭PWM输出,并提供了经过验证的安全操作宏与函数库,帮助开发者彻底解决此问题,实现0%-100%的平滑控制。

yyy34的博客 747

外设测试 - ATAES132A 加解密芯片测试

原理 使用芯片官方提供的读写操作库,进行先写后读并校验,确认数据一致。 示例代码 int main(void) { uint8_t ret; aes132p_enable_interface(); ret = write_memory_test(); if (ret != AES132_FUNCTION_RETCODE_SUCCESS) { aes132p_disable_interface(); printf

一个软件工程师的技术笔记 853

深入浅出工厂模式

一、引子       话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰、Bmw宝马、Audi奥迪,还雇了司机为他开车。不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上Audi说“开奥迪车!”。你一定说:这人有病!直接说开车不就行了?!       而当把这个暴发户的行为放到我们程序设计中来时,会发现这是一个普遍存在的现象。幸运的是,这

eyeqq的专栏 2249

全15万字丨PyTorch 深度学习实践、基础知识体系全集;忘记时,请时常回顾。

本篇博客介绍的知识是——深度学习之PyThon框架基础。这是深度学习/神经网络的基础,多次回顾,会有不一样的感受。书读百遍,其义自见。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 5784

Java工厂模式

 Java工厂模式 Java工厂模式看了这么多关于工厂模式的讲解,还是觉得这篇文章讲的好理解,贴出来和大家分享分享。 一、引子              话说十年前,有一个****户,他家有三辆汽车——Benz奔驰、Bmw宝马、Audi奥迪,还雇了司机为他开车。不过,****户坐车时总是怪怪的:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上Audi说“开奥迪车!”。你一

jmen6的专栏 1622

华为OD机考双机位C卷 - 区间交集(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 区间交集

算法大师! 1136

计算机实战分享3:森林火灾预测分析可视化机器学习预测-完整数据代码-可直接运行

计算机实战分享3:森林火灾预测分析可视化机器学习预测-完整数据代码-可直接运行

603

JAVA设计模式之工厂模式(三种工厂模式)

JAVA设计模式之工厂模式(三种工厂模式)

m0_65260253的博客 2万+

OpenClaw插件开发指南:扩展AI智能体的无限可能

OpenClaw插件开发指南介绍了如何扩展AI智能体的功能。该插件系统支持多种类型(功能、集成、工具、界面、工作流插件),具有模块化、低耦合等优势。开发环境需要安装SDK和工具包,通过plugin.json配置插件信息,主文件实现核心功能。API提供智能体管理、任务执行等接口,示例演示了文本处理插件的创建流程。开发者可基于此框架灵活扩展OpenClaw的能力。

一键难忘的博客 560

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

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

人工智能的专栏 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

工厂模式(简单工厂模式+工厂模式)

工厂模式的在没有工厂模式的时候就是,客户需要一辆马车,需要客户亲自去创建一辆马车,然后拿来用。

m0_62645012的博客 1552

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

工厂模式与抽象工厂模式

工厂模式 模式定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类 作用:实现了创建者和调用者的分离 详细分类:  简单工厂模式  工厂方法模式  抽象工厂模式 核心本质:  实例化对象不使用new,用工厂方法代替  将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。 三种模式: ◆简单工厂模式  用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有代码),不满足开闭原则 ◆工厂方法模式  用来生产同一等级结构

qq_41784749的博客 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

什么是工厂模式

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

深度学习炼丹炉 3547

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

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

GeorgeGuoo的博客 2615

设计模式之简单工厂模式、工厂模式和抽象工厂模式

简单工厂模式、工厂模式和抽象工厂模式 1. 简单工厂模式 简单工厂模式属于创建型模式,是工厂模式的一种。简单工厂模式定义了一个创建对象的类,由这个类来封装实例化对象的行为。它是由一个工厂对象决定创建出哪一种产品类的实例。 简单工厂模式是工厂模式中最简单使用的模式。 简单工厂模式的三个角色 Factory(工厂角色) :简单工厂模式的核心,它负责实现创建所有实例的内部逻辑,根据调用时传入的参数,从而创建不同的对象。 Product(抽象产品角色) :简单工厂模式中所创建所有对象的父类,负责描述所以产品

JustToFaith 2169

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

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

m0_51797179的博客 797

设计模式——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

声明: 本博客名词定义等内容和图多是参考C语言中文网。 主要记录学习以下内容: 一、简单工厂模式 二、工厂方法模式 三、抽象工厂模式 工厂模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作放到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。 一、简单工厂模式 1.与简单工厂模式有关的基本概念 我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建

yi_chengyu的博客 1720

工厂模式与代理工厂模式

一 ,工厂模式           工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。        由于工厂模式较为简单,就不进行详细的解释,文章中直接进行代码的演示举例,同学们有兴趣可以在这里看看...

南城渔客 3417

简单工厂模式、工厂模式、抽象工厂模式、工厂方法模式

工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类,这使得创建对象的过程与使用对象的过程实现了分离。一句话概括工厂模式简单工厂:一个具体工厂类,一个产品抽象类。普通工厂:多个具体工厂类,一个产品抽象类。抽象工厂:多个具体工厂类,多个产品抽象类。生活中的工厂模式简单工厂:一个鼠标工厂,只生产鼠标(可以是不同品牌)。普通工厂:多个不同品牌的鼠标工厂,只生产鼠标。抽象工厂:多个不同品牌的 PC 工厂,即可以生产鼠标、又可以生产键盘。简单工厂模式、普通工厂模式、抽象工厂模式的关联。

干就完了!!! 1034

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

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

蔡茂的博客 1115

设计模式之工厂模式(简单工厂、工厂方法、抽象工厂)

其他实现原理和流程同工厂方法模式。只不过抽象工厂中包含很多个具体的功能,是一个超级工厂父类。:实例化具体对象不需要关系具体细节,直接根据参数从工厂索要即可,初步实现了责任的分离。,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。既保留了简单工厂的优点,同时又解决了简单工厂的缺点。(因为工厂类定义了一个静态方法)相对于工厂方法模式来说,就是。

weixin_43287459的博客 1213
上一篇: Java计时器Timer 使用
下一篇: 工厂模式
MyJavaBlog
博客等级 码龄16年 11粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值