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

news2024/9/20 22:58:09

工厂方法模式

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

工厂方法模式的结构 

工厂方法模式包含以下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();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2124264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一篇文章带你看懂住宅代理如何实现内容过滤

在网络安全中&#xff0c;内容过滤是用户隐私保护的重要组成部分&#xff0c;将不良内容拦截在安全网之外是内容过滤的重中之重。在当下&#xff0c;住宅代理作为异军突起的网络安全工具&#xff0c;在内容过滤上有着不错的表现。本文将深入探讨住宅代理如何实现内容过滤&#…

项目小结二()

一.个人信息的界面 这里可以进行用户信息的修改&#xff0c;并渲染数据上去 二.这两天&#xff0c;出现的问题&#xff1a; 1.mybatis中 字段取别名 &#xff08;还没验证&#xff0c;是否正确&#xff09; 问题描述&#xff1a;由于实体类中的变量名&#xff0c;与数据库中…

数据权限的设计与实现系列8——前端筛选器组件Everright-filter集成框架开发1

背景 前面我们对筛选器组件进行了功能探索和技术验证&#xff0c;接下来就开始着手集成工作&#xff0c;融入一二三开发平台&#xff0c;打通前后端&#xff0c;最终让数据权限控制功能落地。 整体集成工作比较复杂&#xff0c;我们遵循由易到难的原则&#xff0c;先搭建出完整…

IPv6理论基础

IPV6 地址介绍 地址标识方法 格式 : XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX&#xff0c;128bit&#xff0c;8个16位&#xff0c;16进制 X表示十六进制的一个字符&#xff0c;可以是0 - 9,A -F 字母大小写不敏感&#xff0c;最终设备上显示均为大写 一个地址由8个字段构成…

Leetcode3266. K 次乘运算后的最终数组 II

Every day a Leetcode 题目来源&#xff1a;3266. K 次乘运算后的最终数组 II 解法1&#xff1a;3266. K 次乘运算后的最终数组 II 用最小堆手动模拟操作&#xff0c;直到原数组的最大值 mx 成为这 n 个数的最小值。 设此时还剩下 k 次操作&#xff0c;那么&#xff1a; 对…

HarmonyOs DevEco Studio小技巧11--AI插件

AI智能辅助编程工具 CodeGenie 简介 DevEco AI辅助编程工具&#xff08;CodeGenie&#xff09;为开发者提供高效的应用/服务AI辅助编程工具&#xff0c;支持HarmonyOS NEXT领域的智能知识问答、ArkTS代码补全/生成和万能卡片生成能力&#xff0c;提高开发者编码效率。 文档中…

mysql整体架构描述

文章目录 数据库架构示意图1. 连接层2. 服务层3. 存储引擎层4. 文件系统层5. 系统层主要特性 数据库文件格式InnoDB 存储引擎文件类型及用途 MyISAM 存储引擎文件类型及用途 其他文件类型文件内容示例表结构文件示例 (.frm)InnoDB 数据文件示例&#xff08;.ibd&#xff09;MyI…

(十四)、为 SpringCloud 项目生成 Docker 镜像

文章目录 1、原理2、最佳实践2.1、获得 SpringCloud 微服务启动模块的 jar 文件2.2、准备文件夹和 Dockerfile 文件2.3、 Dockerfile 文件的内容2.4、通过命令行构件新镜像 3、异常情况和处理&#xff1a;failed to create LLB definition3.1、现象3.2、解决配置国内镜像仓库清…

【Python报错已解决】 ModuleNotFoundError: No module named ‘tensorboard‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;使用pip安装TensorBoard…

vue3.0 使用echarts与echarts-gl 实现3D饼图

效果 安装echarts npm install echarts npm install echarts-gl 3d饼图组件&#xff1a; <template><div style"width: 100%; height: 100%" ref"echart"></div> </template><script setup> import { reactive, ref, onMou…

docker部署FastDFS文件系统详细记录,每个步骤都有详细记录。含linux和windows双系统安装教程

docker部署FastDFS文件系统详细记录 参考文章docker搭建FastDFS文件系统&#xff08;最详细版&#xff09; 文章里所有步骤由作者亲自测试&#xff0c;所以和 原文有不少差异 文章里所有步骤由作者亲自测试&#xff0c;所以和 原文有不少差异 文章里所有步骤由作者亲自测试&…

HTML + CSS - 网页布局之一般布局浮动布局

1. 一般布局 1.1 一般布局相关参数 元素内容常常可以想像为放在一个盒子里&#xff0c;然后在周边加上内边距&#xff0c;边框和外边距&#xff0c;是盒子模型 默认一个块级区域会填充父类所有的行向空间&#xff0c;并且沿着块伸长容纳其内容&#xff0c;可以为块状体设置某…

18、公司信贷管理|贷款额度的测算|贷款期限及其定价的设定逻辑!

银行在综合权衡贷款的第一还款来源和第二还款来源、风险和收益的基础上&#xff0c;应明确提出贷与不贷的意见。经调查审查同意的贷款&#xff0c;应提出最终的融资方案。 合理的融资方案既要有利于提升本行的竞争力&#xff0c;又要有利于控制贷款风险。完整的融资方案一般包…

苹果的“AI茅”之路只走了一半

今年苹果发布会最大的亮点&#xff0c;也许是和华为“撞档”&#xff0c;又或者是替腾讯“发布”新手游&#xff0c;但肯定不是iPhone 16。 9月10日&#xff0c;苹果秋季新品发布会与华为见非凡品牌盛典相继举行&#xff0c;iPhone 16系列也与HUAWEI Mate XT同日发布。 不过&…

性能测试-jmeter脚本录制(十五)

一、jmeter脚本录制&#xff08;不推荐&#xff09;简介&#xff1a; 二、jmeter脚本录制步骤 1、添加代理服务器和线程组 2、配置http代理服务器的端口和目标线程组 3修改本机浏览器代理 4、点击启动 5、每次操作页面前&#xff0c;修改提示文字

html 中如何使用 uniapp 的部分方法

示例代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…

2024年,最新 OKR 优秀案例集(建议收藏)

我们发现&#xff0c;在你学习 OKR 的例子之前&#xff0c;先回顾一下 OKR 是如何写的&#xff0c;会有帮助。这样&#xff0c;你就能更好地理解下面描述的目标和关键结果的例子。 好消息是&#xff0c;Tita 的 OKR案例库有很多例子可以学习&#xff0c;它们从公司的 OKR 开始…

离散时域和连续频谱之间的傅里叶

要得到虚假的时域离散点&#xff0c;要用频域一个周期的积分

对接开源大模型应用开发平台最佳实践

本文以Dify为例介绍如何使用OpenSearch LLM智能问答版对接大模型应用开发平台构建RAG系统。 背景 随着AIGC技术日新月异的发展&#xff0c;LLM应用也在持续迭代。基于LLM、Agent框架、工作流编排能力等&#xff0c;可以搭建不同场景下丰富的应用服务。其中&#xff0c;检索增…

基于node.js koa2模拟快递柜存储取出快递微信小程序

本文介绍了一个基于Node.js Koa2框架的快递柜存储和取出快递的微信小程序。首先&#xff0c;我们使用Koa2框架搭建了一个简单的后端服务器&#xff0c;用于处理微信小程序发送的请求。然后&#xff0c;我们实现了快递柜的存储和取出功能&#xff0c;用户可以通过微信小程序扫描…