设计模式[2]-旧话重提之-各种工厂模式

WinDbg调试工具安装全攻略:从下载到配置的保姆级教程(Windows 10/11适用) 本文提供了一份详细的WinDbg调试工具安装与配置指南,适用于Windows 10/11用户。文章对比了WinDbg Preview独立版与SDK内置经典版的区别,并手把手指导从Microsoft Store或Windows SDK完成安装。核心部分重点讲解了如何配置符号文件路径与源代码路径,这是让WinDbg发挥强大调试功能的关键步骤,并针对常见安装问题提供了实用的排错方法。 阅读详情

 

设计模式[2]-旧话重提之-各种工厂模式

一、             序言

在所有已知的各种模式中,最重要的和应用范围最广泛的模式应该就是隶属于创建型模式工厂模式了。尤其是在Framework的编程中使用更为广泛,毫不夸张的讲几乎任何一个优秀框架中都有工厂模式的影子。 工厂模式虽然结构比较简单,却集中体现了面向对象设计中最重要的几个特性, 面向抽象、封装、委托、继承、多态在工厂模式中都有很好的体现。 其实说起工厂模式相信大家都不会觉得陌生,甚至更多的朋友都在实际工作过程中不自觉地或者有意识的在使用着它。写这篇文章目的是让不清楚或不熟悉工厂模式的人来系统的了解这种模式设计的思想和如何在实际的软件设计和开发过程中应用。

二、             定义

为了把对象的创建过程和使用过程进行分离,定义通用的接口用于创建对象。

             

三、             叙述几种工厂模式

            Template Method

从简单到复杂是介绍复杂事物的最基本的方式。从简单说起在所有的工厂模式中最简单的工厂模式应该就是使用Template Method的方式创建对象的实例。也有好多人认为这种方法还不能算是工厂模式,可是从其所起的本质的作用和实际运行机制来看应该可以也算作一种特殊形式的工厂模式。

具体的实现方法是:在目标类中增加一个方法,该方法的目的就是为了创建该对象或是该对象的抽象的实例。一般情况下为了便于使用把这个方法通常都被声明成静态的。

示例代码:

              public class Vehicle

              {

                  private Vehicle()

                  {

                       //

                       // TODO: 在此处添加构造函数逻辑

                       //

                  }

                  private void PrepareBehavior()

                  {

                       //初始化设置对象

                  }

                  /// <summary>

                  /// Template Method 负责创建Vehicle的实例

                  /// </summary>

                  /// <returns></returns>

                  public static Vehicle GetInstance()

                  {

                       Vehicle objVehicle = new Vehicle();

                       objVehicle.PrepareBehavior();

                       return objVehicle;

                  }

  }

上面代码就是一个最简单的应用,正如我在前面文章里设计模式-旧话重提之类工厂的使用所说的,利用这种方式可以把new 操作从业务逻辑类中脱离出来,解除业务逻辑类与Vehicle具体的类(type)之间的耦合。把在系统中创建对象的操作从业务逻辑类中脱离出来,改为使用一个单独的方法来完成,这样即使未来创建对象的过程发生改变,这种改变也和我们的业务逻辑编码无关,我们需要做的仅仅是修改这个方法的实现代码。在GetInstance()方法返回实例之前我们可以为这个实例做各种准备工作:可以修改一些状态、执行一些我们必要的方法,如果有需要我们甚至可以让GetInstance() 方法直接返回Vehicle 类的具体实现的子类型。而所有的这些实现都是密闭的,是和外部无关的。

在实际项目的应用中如果目标对象的继承体系比较简单、固定,功能比较单一,可能在未来发生的变化是比较容易预期到的,则可以考虑使用这种方法。

简单工厂模式  

一般是一个工厂类对应多个具体产品类,通过外界向工厂传递的参数来判断创建某一个具体的产品类。

既然被叫做“工厂”当然不能只生产一样产品,简单工厂只生产同一家族的产品,具体的说就是简单工厂创建的类都是从同一个抽象继承下来的。根据客户不同的需求来创建不同的类,可是被创建的类都必须满足一个条件:必须是同一家族的产品(从同一个根继承下来的子类)。例如:有一个生产水果的简单工厂,根据客户的需要可以生产苹果、橘子、葡萄、香蕉,但是必须满足一个要求,就是它只能生产水果。如果客户需要机器、房屋等东西,那么这些要求都将不能被满足.

简单工厂结构简单,由三个部分构成:

类工厂 : 是最核心的部分,作为简单工厂对外使用的接口,负责实现创建实例的逻辑 。

抽象产品: 工厂生产所有的产品的抽象 ,可能是抽象类或接口,也可能是普通的基类。

具体产品: 简单工厂创建的具体类的实例 。

示例代码

Public Class Vehicle

{

 

}

Public Class Car : Vehicle

{

}

Public Class Train : Vehicle

{

}

Public class SimpleFactory

{

    Public Vehicle Create(string type)

{

    If (条件判断)

{

    Return new Car();

}

If (条件判断)

{

    Return new Train();

}

 

 

}

….其他判断条件

Return new Other();

}

 

在简单工厂结构的三部分中工厂类部分是重中之重,所有的核心功能都是靠工厂类实现的,如根据条件判断创建哪种具体的产品,以及实际创建产品等。在这一点上违背了“对象的职责均衡分布的原则”,因为功能过于集中在工厂类本身,随着简单工厂生产的产品种类的增加,使其业务逻辑无限的增加,会使其本身越来越复杂而难于维护和扩展。例如,如果增加产品,必须更改工厂类的代码逻辑。简单工厂比工厂方法和抽象工厂相比其优势是简单易用。只靠一个工厂类就可以创建所有的产品类,而缺点就是随着产品种类增加使其越来越难以使用。当工厂只生产同一品种的具体产品,而且产品数量有限的时候,可以考虑使用此工厂模式。

         Factory Method模式

       在工厂父类中定义一个标准的方法用来生产产品。一般来说这个方法应该被声明成抽象方法(当工厂父类是抽象类的时候),或接口中的空方法(工厂父类仅仅是接口),这个方法只有方法的定义并没有具体实现。将这个方法的具体实现延迟到子类中来完成。这样父类只需要负责取出抽象的产品,而不必关心怎么去创建具体的产品和到底创建哪一种具体的产品。至于究竟应该创建何种具体的产品由具体的子类负责决定。考虑到简单工厂模式中因为功能过于集中在工厂类中而产生的种种的缺陷,在Factory Method模式中把工厂类生产产品的定义和生产具体产品的实现拆分开,用一个类的继承体系来消除工厂类中复杂的逻辑判断语句。从而使类的职责、能力能够比较均衡的分布。

Factory Method结构由四个部分构成:

抽象类工厂 : 定义统一的接口来创建产品。

具体类工厂 :实现创建具体产品类的类工厂(一般为多个)。

抽象产品: 工厂生产所有产品的抽象 ,可能是抽象类或接口,也可能是普通的基类。

具体产品: Factory Method创建的具体类的实例(多个)。

示例代码

Public abstract  class  AbstractFactory

{

       Public abstract  Vehicle Create();

 

}

Public class CarFactory : AbstractFactory

{

       Public override Vehicle Create()

       {

              Return new Car();

       }

}

Public class Train Factory : AbstractFactory

{

       Public override Vehicle Create()

       {

              Return new Train ();

       }

}

 

       这样一来,客户端程序可以通过更改创建产品的工厂类的子类,用统一的方式创建不同的具体产品。即使需要增加生产新的产品也不需要修改现有的代码,只要创建一个生产这个产品的子工厂类就可以了。前提是这个新产品和原来工厂生产的产品必须是一类的(接口必须是一致的)。工厂方法模式的优势是:因为生产具体产品是靠子工厂类实现的,增加新的产品不会影响到现有的程序,从这点上来看程序是“闭合”的。修改子工厂类的实现方式也不会影响客户端的使用。同时它的局限也很明显,在工厂方法模式中因为所有的具体产品都是同一个父类(或接口)继承下来的,它只能生产“同一种类”的具体产品。比如上例:这个工厂只能生产各种类的 Vehicle   , 如果你需要食物、水果和电子产品的话,那么上面的工厂方法模式是不可能满足你的。还有因为在客户端调用此模式生产产品的时候是直接使用的子工厂类,如果需要修改生产产品的种类的话,则需要修改客户端的代码,这点有些不满足面向抽象的原则。如果要解决这种问题那就需要和别的设计模式结合起来使用。

         Abstract Factory模式

                上面讲的工厂模式并不能够生产不同种类的产品,为了解决这个问题,就需要使用Abstract Factory模式 。抽象工厂模式和工厂方法模式有了很大的不同。Abstract Factory模式的目的提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。使用抽象工厂创建的产品是“产品族”,也就是两族或两族以上的产品,并且这些产品是“相关”的、“相互依赖”的。如果只生产一族产品,抽象工厂模式就完全退化成了工厂方法模式。

所以抽象工厂使用的前提条件有两个:

1、生产产品族大于一族,只有生产两族以上的产品才使用抽象工厂。

2、产品之间有特殊的相关或依赖关系,产品之间应该最少应该有两种关系,纵向来看每种产品组内部产品之间有继承关系。例如:产品AbstractProductA与ProductA1和ProductA2之间有继承关系是同一产品族产品。横向来看两个产品族之间的产品也应该有一一对应关系,例如:ProductA1与ProductB1之间,或ProductA2与ProductB2之间的对应关系。在只满足条件1的前提下,感觉应该使用多个工厂方法模式来代替抽象工厂模式,这样使用起来应该会方便一些。

 

 

 

ThinkBook 16 2024 Ubuntu驱动全攻略:从无线网卡到触控板 本文详细介绍了ThinkBook 16 2024在Ubuntu系统下的驱动问题解决方案,涵盖无线网卡、蓝牙、显卡和触控板等关键硬件的驱动修复步骤。通过具体命令和配置指南,帮助用户快速解决兼容性问题,提升Ubuntu在ThinkBook上的使用体验。 阅读详情

相关推荐

多标签分类怎么做?(Python)

首先简单介绍下,多标签分类与多分类、多任务学习的关系: 多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类

y1282037271的博客 1359

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

简单工厂模式:通过一个工厂类根据参数创建不同类型的产品,客户端只需知道工厂类。工厂方法模式:定义了一个工厂接口,每个具体工厂负责创建特定的产品,便于扩展新产品类型。抽象工厂模式:主要用于创建一组相关的产品,通过具体工厂类实现,可以同时创建多个相关的产品,确保产品之间的兼容性。

2301_76606232的博客 3006

牛耕式全覆盖算法-matlab代码

牛耕式路径全覆盖算法,也称为牛耕算法或者蚂蚁算法,是一种用于解决路径规划问题的启发式算法。这个算法的灵感来自于牛在耕田时的行为。在这个算法中,假设有一块田地需要耕作,牛从田地的某个角落开始行走,走过的路径会被标记。牛会优先选择尚未经过的路径,当所有的路径都走过后,算法停止。在路径规划问题中,田地可以看作是一个由节点和边构成的图。每个节点代表一个位置,每条边代表两个节点之间的连接。路径全覆盖问题是找出一组路径,使得每个节点都被至少一条路径经过。牛耕式路径全覆盖算法的基本思想是以启发式的方式逐步构建路径。

m0_69611489的博客 1689

三种工厂模式区别总结

工厂模式分为三种:简单工厂、工厂模式和抽象工厂模式。三者之间存在哪些异同呢?先分别看看各个模式的特点 一、     简单工厂模式: 实现了算法和界面的分离,也就是将业务逻辑和界面逻辑分开了,降低了耦合度。 算法的封装:  定义一个抽象的算法接口,提供不同算法的公共接口方法。其他具体算法继承这个抽象类,并实现具体的算法。 简单工厂类:  作为一个独立的类,实现了针对不同的算法进行

lingfengtengfei的专栏 4万+

ANSYS Help USER300

USER 300概述单元描述输入数据假设与限制条件 概述 单元描述 Mechanical APDL提供了一种方便的方法来创建自定义的单元,命名为USER300,可以创建几乎任何单元类型。 UserElem子程序为Mechanical APDL在单元类型创建上提供了一个接口,可传递用户自定义单元创建时所需的所有数据,然后从自定义单元返回所有数据和结果,以更新数据库和文件。因为通过接口可以访问数据库和文件信息,所以很少需要了解Mechanical APDL数据库程序和文件结构。该接口还提供了获取Mechanic

weixin_47019765的博客 2234

高通SDX55平台:5G速率问题排查分析方法

和大家分享一下高通5G平台5G速率问题排查分析方法。

四儿家的小祖宗的博客 5219

三种工厂模式的比较

简单工厂模式:简单工厂模式最大的优点在于工厂类中包含了必要的判断逻辑,根据客户端的条件动态的实例化相关的类,对于客户端来说去除了对具体产品的依赖工厂模式:定义一个用于创建对象的接口,让子工厂决定实例化哪一个类,工厂方法使一个类的实例化,延迟到子类中去实现,可以在具体工厂产生实例的时候,做各种校验,和产生规则,避免了直接用new带来的不方便控制流程。抽象工厂:升级了对产品的再次抽象,abstract...

itbigboy的博客 6308

Microsoft AI SDK 与 SAP ABAP:让企业级 AI 能力触手可及的深度整合指南

借助 Microsoft AI SDK,ABAP 开发者无需跳出熟悉的事务码与数据字典,就能把 GPT‑4 的强大语言理解与生成能力深度植入采购、销售、财务等核心业务流程。只要掌握“初始化 SDK → 构造 Prompt → 解析输出”这一范式,未来无论 Azure OpenAI、OpenAI 还是本地化 LLM,都能在同一套代码骨架内快速切换,实现真正的“AI 即服务”。现在,就让我们在下一行 ABAP 里拥抱智能未来。参考链接均于 2025‑07‑22 提取,推荐读者结合实际版本进一步验证。

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

各种工厂模式

本文介绍各种工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式。文章部分内容来自网址 简单工厂模式 需求 将实例化类的代码抽象出来,使用一个类专门负责实例化各种类,使用者不显示使用new关键字创建类。 UML 代码 public interface Product { } public class ProductImpl1 implements Product { } public class ...

fate_killer_liu_jie的专栏 281

eye-in-hand手眼标定系统

上一个博文说了一种手眼标定系统的特殊情况,就是相机随着机械手一起移动的情况。虽然前面简单介绍了一种办法,就是内次拍照时让相机回到之前标定的位置,但是这样处理机器人的工作效率就会大大降低,产生很多重复动作,所以这篇博文就来讲一种更简单的标定方案。 下面是halcon官方给的手眼标定系统的案例代码。 这个例子主要应用于相机固定在机械手末端的手眼系统中,而且标定板相对于机器人也是静止的。 在这...

二毛的博客 1万+

从0到全栈:C#/.NET/.NET Core终极学习路线——2025年开发者必修的12个阶段与30个实战项目

【代码】从0到全栈:C#/.NET/.NET Core终极学习路线——2024年开发者必修的12个阶段与30个实战项目。

墨夶的博客 2042

几种工厂模式的区别

本文主要根据网络资料整理,主要参考:设计模式导学目录 工厂模式主要包括简单工厂模式、工厂方法模式、抽象工厂模式。看完三种模式的介绍,也许你和我一样并不能完整的说出它们的区别,感觉好像有点类似又有点区别。查阅了网络上的一些解读(例如知乎问答抽象工厂模式和工厂模式的区别),个人觉得可能主要区别是: 简单工厂模式:定义一个工厂类,根据参数的不同返回不同类的实例,被创建的实例通常有共同

tanzhangwen的专栏 2404

《Java开发及前端最全面试题-Offer直通车》目录

Java开发是需求最广,工资高的细分领域,同时也是会的人最多,有的公司招1个Java开发,要面试几十甚至上百面试者,同时要求很高,要求通晓技术栈很多及很深深度。如果你正准备面试,想要脱颖而出,那么《Java开发及前端最全面试题-Offer直通车》是你的不二选择。本书汇集了多篇超过1万字的精华内容,无论是Java基础、数据库、SpringBoot和SpringCloud等必问的,还是前端、k8s等容器和虚拟化和大数据各类技术面试,本书都为你提供了最全面的试题和参考答案。

大模型大数据攻城狮的专栏 1178

设计模式[2]-旧话重提之工厂模式

设计模式[2]-旧话重提之工厂模式 一、 序言 在所有已知的各种模式中,最重要的和应用范围最广泛的模式应该就是隶属于创建型模式工厂模式了。尤其是在Framework的编程中使用更为广泛,毫不夸张的讲几乎任何一个优秀框架中都有工厂模式的影子。 工厂模式虽然结构比较简单,却集中体现了面向对象设计中最重要的几个特性, 面向抽象、封装、委...

a859501的博客 169

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

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

各种工厂模式详解

 简单工厂模式         一般是一个工厂类对应多个具体产品类,通过外界向工厂传递的参数来判断创建某一个具体的产品类。      既然被叫做“工厂”当然不能只生产一样产品,简单工厂只生产同一家族的产品,具体的说就是简单工厂创建的类都是从同一个抽象继承下来的。根据客户不同的需求来创建不同的类,可是被创建的类都必须满足一个条件:必须是同一家族的产品(从同一个根继承下来的子类)。例如:有一个生产水果

yesuner的专栏 1167

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

.Net CSharp语言中When关键字的用法

c# 6引入了when关键字。when关键字是通过某些特定标准来过滤catch块中的异常的一种方法。后来在c# 7中扩展到case语句。我们将介绍如何在异常处理中和case语句使用when关键字。 普通的Catch处理 假设您希望使用不同的标准处理相同类型的异常。一个常见的场景是HttpException。当您捕获一个HttpException时,会返回一个响应代码。根据响应代码的不同,您可能...

家园 2949

元数据(metadata)在企业应用开发中的作用

元数据(metadata)在企业应用开发中的作用 元数据(metadata)介绍:Metadata(元数据),它是“关于数据的数据”(data about data),近年来在软件设计中Metadata有广泛的应用。在编程中,元数据不是被处理的对象,而是通过改变元数据的一些“值”来改变程序的运行的数据。可以“解释”程序的运行时,不同的元数据值可以让同一段程序有不同的运行结果。元数据(metadat

家园 1685

设计模式-旧话重提之类工厂的使用

设计模式-旧话重提之类工厂的使用                 作者:janes   工厂模式大家都非常熟悉包括常用的简单工厂、工厂方法、和抽象工厂等几种。总的来说应该这样定义:定义一个通用的接口用来创建对象。无论是使用哪一种工厂模式目的都相同,那就是“把对象的创建和对象的使用过程分离使其可以自由变动,而不会相互影响”。                       使用工厂模式可以避免在程序

家园 1265

在Smartphone/Pocket PC 2003上设置提醒

转贴自http://blog.joycode.com/musicland/articles/34511.aspx在用.NET CF开发Smartphone/Pocket PC应用时,我们经常需要给应用程序增加提醒功能,比如在下午两点时提醒用户去开会,或者在手持设备和PC通过ActiveSync连接时提醒用户同步某项重要数据。目前,实现提醒功能主要有以下几种方式: Windows CE

家园 1192

自定义的数据集合对象的自定义排序和显示

部分代码:数据实体对象:using System;using VUser.ECommerce.DataProxy;namespace VUser.ECommerce.Core{ [Serializable] public class BaseObject :  IComparable {    #region 域成员       private int m_ID;  private str

家园 1182

回家过年了

     过了今天中午,就作在回家的列车上了     回家,多么熟悉又亲切字眼     想想一个人在外多年的漂泊     无语******     除了渐渐增加的年轮     一事无成     辞职了     明年要面临新的工作     祝我自己有个好的新开始      也祝愿各位朋友     万事如意!

家园 897

最近在使用sps类库过程中发现了一个让我比较疑惑的问题(有关items属性的)

大家都知道 SPList对象有个属性 items ,在文档中是这样解释的The Items property of the SPList class gets the collection of all items in the list. Remarks返回当前 List中的所有的item对象集合The Items property returns all the files in a

家园 887

数据绑定到自定义的对象(.net)

这段程序是从一个小的项目中摘出来的,可能不能直接编译通过,我是想把自己的思路给出来相互交流,希望大家给我指点谢谢拉:)全文阅读

家园 831
上一篇: 定制SPS实战记录 系列之二
下一篇: 利用vs.net快速开发windows服务(c#) 选择自 LoveCherry 的 Blog
codinghello
博客等级 码龄25年 47粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值