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

工厂方法模式和抽象工厂模式

工厂方法模式

一个工厂只能创建一种产品

工厂方法模式的结构 

工厂方法模式包含以下4个角色 

Product(抽象产品)

ConcreteProduct(具体产品)

Factory(抽象工厂)

ConcreteFactory(具体工厂)

模式缺点

  1. 系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销
  2. 增加了系统的抽象性和理解难度
  3. 一个具体工厂只能创建一种具体产品/如果我们想更换另外一种产品,仍然需要修改具体的工厂类

模式适用环境

  1. 客户端不知道它所需要的对象的类(客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体产品对象由具体工厂类创建)
  2. 抽象工厂类通过其子类来指定创建哪个对象

代码示例

Program

namespace 工厂模式
{internal class Program{static void Main(string[] arg){IFactory factory = new TVFactroy();factory.ManfactureProduct().ShowInfo();//创建工厂IFactory factory1 = new WaterFactroy();factory1.ManfactureProduct().ShowInfo();}}
}

工厂基类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 工厂模式
{/// <summary>/// 抽象工厂基类/// </summary>public abstract class IFactory{//生产产品public abstract IProduct ManfactureProduct();}
}

产品基类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 工厂模式
{/// <summary>/// 抽象产品类/// </summary>public abstract class IProduct{public string Name { get; set; }//产品名称public abstract void ShowInfo();//展示产品信息}
}

具体电视工厂

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 工厂模式
{public class TVFactroy : IFactory{public override IProduct ManfactureProduct(){return new TVProduct("龙江彩电");}}
}

具体水工厂

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 工厂模式
{internal  class WaterFactroy: IFactory{public override IProduct ManfactureProduct(){return new WahingMachineProduck("龙江水");}}
}

水工厂里生产的产品

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 工厂模式
{public class WahingMachineProduck : IProduct{public WahingMachineProduck(string name){Name = name;}public override void ShowInfo(){Console.WriteLine($"一台{Name}被生产出来了");}}
}

电视工厂中生产的产品

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace 工厂模式
{public class TVProduct : IProduct{public TVProduct(string name){Name = name;}public override void ShowInfo(){Console.WriteLine($"一台{Name}被生产出来了");}}
}

抽象工厂模式

一个工厂可以生产多个产品

抽象工厂方法模式的结构

抽象工厂模式包含以下4个角色:

AbstractFactory (抽象工厂)
ConcreteFactory (具体工厂)
AbstractProduct (抽象产品)
ConcreteProduct (具体产品)

代码示例

namespace _008_抽象工厂
{/// <summary>/// 抽象工厂/// </summary>public abstract class AbstractFactory{public  abstract AbstractProductTV CreateProductTV();//电视机生产线public abstract AbstractProductIceBox CreateProductIceBox();//冰盒子生产线}
}

namespace _008_抽象工厂
{/// <summary>/// 冰盒子基类__抽象产品B/// </summary>public abstract class AbstractProductIceBox{public string Name { get; set; }//产品名称public abstract void ShowInfo();//展示产品信息}
}


namespace _008_抽象工厂
{/// <summary>/// 电视机基类__抽象产品A/// </summary>public abstract class AbstractProductTV{public string Name { get; set; }//产品名称public abstract void ShowInfo();//展示产品信息}
}

namespace _008_抽象工厂
{/// <summary>/// 海尔冰箱_具体产品B1/// </summary>public class HaiErBox : AbstractProductIceBox{public override void ShowInfo(){Name = "海尔冰箱";Console.WriteLine($"一台{Name}被生产出来了");}}
}

namespace _008_抽象工厂
{/// <summary>/// 美的冰箱_具体产品B2/// </summary>public class MeiDiBox : AbstractProductIceBox{public override void ShowInfo(){Name = "美的冰箱";Console.WriteLine($"一台{Name}被生产出来了");}}
}

namespace _008_抽象工厂
{public class HaiErTV : AbstractProductTV{/// <summary>/// 海尔电视_具体产品A1/// </summary>public override void ShowInfo(){Name = "海尔电视";Console.WriteLine($"一台{Name}被生产出来了");}}
}

namespace _008_抽象工厂
{/// <summary>/// 美的电视_具体产品A2/// </summary>public class MeiDiTV:AbstractProductTV{public override void ShowInfo(){Name = "美的电视";Console.WriteLine($"一台{Name}被生产出来了");}}
}


namespace _008_抽象工厂
{/// <summary>/// 美的工厂__具体工厂/// </summary>public class MeiDiFactory : AbstractFactory{public override AbstractProductIceBox CreateProductIceBox(){return new MeiDiBox();}public override AbstractProductTV CreateProductTV(){return new MeiDiTV();}}
}

namespace _008_抽象工厂
{/// <summary>/// 海尔工厂__具体工厂/// </summary>public class HaiErFactory : AbstractFactory{public override AbstractProductTV CreateProductTV(){return new HaiErTV();}public override AbstractProductIceBox CreateProductIceBox(){return new HaiErBox();}}
}

调用

namespace _008_抽象工厂
{internal class Program{static void Main(string[] args){AbstractFactory factory=new HaiErFactory();factory.CreateProductIceBox();factory.CreateProductTV();}}
}

建造者模式

建造者模式的定义

建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

  • 将客户端与包含多个部件的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可
  • 关注如何逐步创建一个复杂的对象,不同的建造者定义了不同的创建过程

甚至可以把不同具体建造者的零部件,通过指挥者构造出不同的产品

建造者模式的结构

建造者模式包含以下4个角色:

  1. Builder(抽象建造者)
  2. ConcreteBuilder(具体建造者)
  3. Product(产品)
  4. Director(指挥者)

代码示例


namespace _009_建造者模式
{/// <summary>/// 抽象建造者/// </summary>public abstract class Builder{public ProductCar Car { get; set; }//产品引用public abstract void BuildEngine_A();//建造汽车引擎public abstract void BuildGearBox_B();//建造变速箱public abstract void BuildClutch_C();//建造离合器public abstract void BuildSteeringWheel_D();//建造汽车方向盘public abstract void BuildThrottle_E();//建造加速器public abstract ProductCar GetBuildResult();//返回建造的结果(产品)}
}

namespace _009_建造者模式
{/// <summary>/// 指挥者/// </summary>public class Director{private Builder _builder;//建造者引用//通过构造函数传入具体建造者public Director(Builder builder){_builder = builder;}//构建方法1-自动挡(没有离合器)public ProductCar Construct(){_builder.BuildEngine_A();_builder.BuildGearBox_B();_builder.BuildSteeringWheel_D();_builder.BuildThrottle_E();Console.WriteLine("构建自动挡汽车");return _builder.GetBuildResult();}}
}


namespace _009_建造者模式
{/// <summary>/// 具体建造者A-江淮汽车/// </summary>public class JiangHuaiBuilder : Builder{public JiangHuaiBuilder(){Car = new ProductCar();}public override void BuildClutch_C(){Car.Clutch_C = "江淮离合器";Console.WriteLine("建造江淮离合器");}public override void BuildEngine_A(){Car.Engine_A = "江淮引擎";Console.WriteLine("建造江淮引擎");}public override void BuildGearBox_B(){Car.GearBox_B = "江淮变速器";Console.WriteLine("建造江淮变速器");}public override void BuildSteeringWheel_D(){Car.SteeringWheel_D = "江淮方向盘";Console.WriteLine("建造江淮方向盘");}public override void BuildThrottle_E(){Car.Throttle_E = "江淮加速器";Console.WriteLine("建造江淮加速器");}public override ProductCar GetBuildResult(){Console.WriteLine("构建产品成功");//返回建造的结果return Car;}}
}

namespace _009_建造者模式
{/// <summary>
/// 定义产品
/// </summary>public class ProductCar{public string Engine_A { get; set; }//发动机public string GearBox_B { get; set; }//变速箱public string Clutch_C { get; set; }//离合器public string SteeringWheel_D { get; set; }//方向盘public string Throttle_E { get; set; }}
}

调用测试

namespace _009_建造者模式
{internal class Program{static void Main(string[] args){Builder builder=new JiangHuaiBuilder();//建造者Director director =new Director(builder);//指挥者ProductCar car = director.Construct();//指挥者指挥建造产品}}
}

相关文章:

工厂方法模式和抽象工厂模式

工厂方法模式 一个工厂只能创建一种产品 工厂方法模式的结构 工厂方法模式包含以下4个角色 Product&#xff08;抽象产品&#xff09; ConcreteProduct&#xff08;具体产品&#xff09; Factory&#xff08;抽象工厂&#xff09; ConcreteFactory&#xff08;具体工厂…...

【星海出品】go语言环境兼install

官网 https://golang.google.cn/dl/ go的安装包下载地址 https://go.dev/dl/ set GO111MODULEon //是否以Go modules的模式运行项目 auto,on,off set GOARCHamd64 //目标可执行程序操作系统构架 包括 386&#xff0c;amd64&#xff0c;arm set GOBIN //项目的第三方可执行文件目…...

Spring 源码解读:自定义实现BeanPostProcessor的扩展点

引言 在Spring的生命周期管理中&#xff0c;BeanPostProcessor是一个非常重要的扩展点。它允许开发者在Bean初始化的前后插入自定义的逻辑&#xff0c;从而实现更灵活的Bean管理。BeanPostProcessor是Spring框架中用于对Bean实例进行修改的机制之一。通过实现该接口&#xff0…...

Spring Boot-分布式系统问题

Spring Boot 在分布式系统中的常见问题及解决方案 随着互联网的发展&#xff0c;系统规模和复杂度越来越大&#xff0c;分布式系统成为应对高并发、大数据量场景的重要架构选择。Spring Boot 作为一种轻量级的开发框架&#xff0c;广泛应用于构建微服务和分布式系统中。然而&a…...

面试题总结(三) -- 内存管理篇

面试题总结(三) – 内存管理篇 文章目录 面试题总结(三) -- 内存管理篇<1> C 中堆内存和栈内存的区别是什么&#xff1f;<2> 如何在 C 中手动管理内存&#xff08;new/delete 操作符&#xff09;&#xff1f;<3> C 中内存泄漏的原因和避免方法<4> 谈谈…...

Qt 定时器-定时备份

定时备份 在Qt 中&#xff0c;可以使用QTimer类来实现定时备份功能。以下是一个示例代码&#xff0c;每隔一段时间自动执行备份操作&#xff1a; #include <QTimer>QTimer timer; int backupInterval 24 * 60 * 60 * 1000;//备份间隔为24小时connect(&timer, &…...

天融信把桌面explorer.exe删了,导致开机之后无windows桌面,只能看到鼠标解决方法

win10开机进入桌面&#xff0c;发现桌面无了&#xff0c;但是可以ctrlaltdelete调出任务管理器 用管理员权限打开cmd&#xff0c;输入&#xff1a; sfc /scanfilec:\windowslexplorer.exe 在运行C:\windows\Explorer.exe&#xff1b;可以进入桌面&#xff0c;但是隔离几秒钟…...

视频分割操作教程

1、打开剪映 2、点击开始创作上面的“”&#xff0c;选择视频&#xff0c;点击添加按钮&#xff0c;导入一个视频素材到剪映 3、滑动视频&#xff0c;让视频竖线到合适位置 4、点击视频&#xff0c;出现白色边框 5、点击工具栏“分割”&#xff0c;然后点击需要删除的视频部分 …...

唯品会大数据面试题及参考答案(3万字长文)

synchronized 和 volatile 的区别 synchronized是 Java 中的关键字,用于实现同步机制,确保在同一时刻只有一个线程可以访问被它修饰的代码块或方法。volatile也是 Java 中的关键字,主要用于保证变量的可见性。 功能方面: synchronized可以保证原子性、可见性和有序性。它通…...

使用容器技术快速入门MinIO

使用容器技术快速入门MinIO 使用容器技术&#xff08;docker或者podman&#xff09;快速部署一个单节点单磁盘 MinIO 服务器&#xff0c;用于对MinIO对象存储及其兼容 S3 的 API 层进行早期的开发和评估。 1. 准备工作 机器已经安装了 Podman 或者 Docker 。 对用于持久卷的…...

ros2教程(一):使用python和C++发布摄像头原始图像和压缩图像

1. 使用python发布图像 在ROS 2中&#xff0c;可以通过使用rclpy库来发布压缩图像和原始图像。发布原始图像可以使用sensor_msgs.msg.Image消息类型&#xff0c;压缩图像则使用sensor_msgs.msg.CompressedImage消息类型。 #!/usr/bin/env python3# function: usbcam publish r…...

【自动化测试】UI自动化的分类、如何选择合适的自动化测试工具以及其中appium的设计理念、引擎和引擎如何工作

引言 UI自动化测试主要针对软件的用户界面进行测试&#xff0c;以确保用户界面元素的交互和功能符合预期 文章目录 引言一、UI自动化的分类1.1 基于代码的自动化测试1.2 基于录制/回放的自动化测试1.3 基于框架的自动化测试1.4 按测试对象分类1.5 按测试层次分类1.6 按测试执行…...

深入理解Python中的“_,”:一个实用的语法特性

在Python编程中&#xff0c;你可能经常会看到一个特殊的标识符“_”。这个符号在Python中有多种用途&#xff0c;其具体含义依上下文而定。本文将探讨其中一种常见用法——作为一个临时性的占位符——并解释它在实际编程中的实用性和应用场景。 1. “_”作为占位符 在Python中…...

Mac清理其他文件:释放存储空间的高效指南

每个Mac用户都可能遇到存储空间不足的问题&#xff0c;尤其是当“其他”文件积累到一定体积时。在Mac上&#xff0c;“其他”文件通常包括各种系统文件、缓存、文档以及不被归类为应用程序、照片、电影或音乐的其他类型的文件。这些文件往往不易被注意&#xff0c;但逐渐占用了…...

html+css+js网页设计 旅游 龙门石窟4个页面

htmlcssjs网页设计 旅游 龙门石窟4个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…...

CISSP一站通关

依托轻速云维护了一个专注于CISSP备考通关的在线学习平台&#xff0c;提供知识串讲视频&#xff0c;配合大量针对性的习题和重难点习题解析&#xff0c;帮助备考学习者高效学习和巩固知识点。已经帮助100考友顺利通过考试。 知识串讲视频是我主讲的5天直播课程的录屏&#xff0…...

Golang | Leetcode Golang题解之第406题根据身高重建队列

题目&#xff1a; 题解&#xff1a; func reconstructQueue(people [][]int) (ans [][]int) {sort.Slice(people, func(i, j int) bool {a, b : people[i], people[j]return a[0] > b[0] || a[0] b[0] && a[1] < b[1]})for _, person : range people {idx : pe…...

【我的Android进阶之旅】解决CardView四个圆角有白边的问题

文章目录 一、问题描述二、分析CardView出现白边的原因三、如何解决这个问题?3.1 如何修复?3.2 为什么这样可以修复?3.3 示例代码3.4 总结一、问题描述 在实现一个RecycleView的Item时候,样式需要用到卡片式效果,于是想到用CardView来实现,但是最终发现运行出来的效果,…...

学习笔记JVM篇(四)

垃圾回收器 说完垃圾回收算法接下来就需要对应的垃圾回收器去回垃圾回收器。接下来介绍几种垃圾回收器 1、Serial 串行回收器&#xff0c;是单线程版本&#xff0c;暂停所有的应用。在单CPU的情况下效率是很高的&#xff0c;因为不涉及线程的上下文切换。适用于小型程序和客…...

828 华为云征文|华为 Flexus 云服务器搭建萤火商城 2.0

《828 华为云征文&#xff5c;华为 Flexus 云服务器搭建萤火商城 2.0》 在 2024 年 9 月 14 日这个特别的日子&#xff0c;我着手利用华为 Flexus 云服务器搭建轻量级、高性能、前后端分离的电商系统萤火商城 2.0&#xff0c;开启了一段充满挑战与惊喜的旅程。 华为 Flexus 云服…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)

旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据&#xff01;该数据集源自2025年4月发表于《地理学报》的论文成果…...