首页 > 其他分享 >04_抽象工厂模式

04_抽象工厂模式

时间:2024-03-08 12:23:15浏览次数:19  
标签:04 int amount void days 工厂 Amount 抽象 public

        抽象工厂模式是一种创建型设计模式,它提供一个接口用于创建一系列相关或相互依赖对象的工厂,而不需要指定具体的类。这种模式通过提供一个抽象的工厂接口,使得客户端可以创建一系列产品对象而无需关心具体的实现细节。

       在抽象工厂模式中,通常会定义一个抽象工厂接口,其中包含多个方法用于创建不同类型的产品。具体的工厂类会实现这个接口,并实现具体的产品创建逻辑。客户端代码通过调用工厂方法来创建产品对象,而不需要了解具体的产品类。

       抽象工厂模式适用于需要创建一系列相关对象并且这些对象之间存在一定的依赖关系的场景。它可以帮助降低代码耦合度,提高代码的可维护性和扩展性。

       总的来说,抽象工厂模式可以帮助我们实现将对象的创建与使用分离,提供一种灵活的方式来创建一系列相关对象。

 Product

/// <summary>
    /// 手机
    /// </summary>
    public interface IPhone
    {
        /// <summary>
        /// 数量
        /// </summary>
        int Amount { get; }
        /// <summary>
        /// 生产
        /// </summary>
        /// <param name="amount"></param>
        /// <param name="days"></param>
        /// <returns></returns>
        int Produce(int amount,int days);
        /// <summary>
        /// 打印
        /// </summary>
        void Write();
    }

 

/// <summary>
    /// 电视
    /// </summary>
    public interface ITV
    {
        /// <summary>
        /// 数量
        /// </summary>
        int Amount { get; }
        /// <summary>
        /// 生产
        /// </summary>
        /// <param name="amount"></param>
        /// <param name="days"></param>
        /// <returns></returns>
        int Produce(int amount, int days);
        /// <summary>
        /// 打印
        /// </summary>
        void Print();
    }

 

 

ConcreteProduct

苹果手机

public class AppleTV : ITV
    {
        public int Amount { get; private set; }

        public void Print()
        {
            Console.WriteLine($"苹果电视一共生产了{Amount}台");
        }

        public int Produce(int amount, int days)
        {
            Amount = amount * days * 128;

            return Amount;
        }


    }
View Code

苹果电视

public class ApplePhone : IPhone
    {
        public int Amount {get;private set;}

        public int Produce(int amount, int days)
        {
            Amount = amount * days * 1000;

            return Amount;
        }

        public void Write()
        {
            Console.WriteLine($"苹果手机一共生产了{Amount}台");
        }
    }
View Code

三星手机

public class SamsungPhone : IPhone
    {
        public int Amount {get;private set;}

        public int Produce(int amount, int days)
        {
            Amount = amount * days * 555;

            return Amount;
        }

        public void Write()
        {
            Console.WriteLine($"三星手机一共生产了{Amount}台");
        }
    }
View Code

三星电视

internal class SamsungTV : ITV
    {
        public int Amount { get; private set; }

        public void Print()
        {
            Console.WriteLine($"三星电视一共生产了{Amount}台");
        }

        public int Produce(int amount, int days)
        {
            Amount = amount * days * 250;

            return Amount;
        }


    }
View Code

 

Creator

 /// <summary>
    /// 抽象工厂
    /// </summary>
    public interface IFactory
    {
        ITV GetTV();
        IPhone GetPhone();
    }

 

ConcreteCreator

 /// <summary>
    /// 苹果工厂
    /// </summary>
    public class AppleFactory : IFactory
    {
        public IPhone GetPhone()
        {
            return new ApplePhone();
        }

        public ITV GetTV()
        {
            return new AppleTV();
        }
    }

 

/// <summary>
    /// 三星工厂
    /// </summary>
    public class SamsungFactory : IFactory
    {
        public IPhone GetPhone()
        {
            return new SamsungPhone();
        }

        public ITV GetTV()
        {
            return new SamsungTV();
        }
    }

 

调用

public class Client
    {
        public void Start()
        {
            IFactory appleFactory = new AppleFactory();
            DoStuff(appleFactory);

            IFactory samsungFactory = new SamsungFactory();
            DoStuff(samsungFactory);
        }

        private void DoStuff(IFactory factory)
        {
            Console.WriteLine($"{factory.GetType().Name} 开始生产");
            var phone = factory.GetPhone();
            phone.Produce(99, 90);
            phone.Write();

            var tv = factory.GetTV();
            tv.Produce(88, 90);
            tv.Print();
            Console.WriteLine($"{factory.GetType().Name} 生产结束");

        }

    }

 

static void Main(string[] args)
        {
            new Client().Start();

            Console.ReadKey();
        }

 

标签:04,int,amount,void,days,工厂,Amount,抽象,public
From: https://www.cnblogs.com/MingQiu/p/18060705

相关文章

  • 03_工厂方法模式
    工厂方法模式是一种创建型设计模式,用于定义一个创建对象的接口,但将实际创建对象的工作延迟到子类中。这样可以使一个类的实例化延迟到其子类中,从而实现解耦和灵活性。在工厂方法模式中,通常包含以下几个角色:抽象工厂(Creator):定义创建对象的接口,通常包含一个抽象的工厂方法,由子类......
  • 02_简单工厂模式
    简单工厂模式(SimpleFactoryPattern)是一种创建型设计模式,属于工厂模式的一种。在简单工厂模式中,通过一个工厂类来负责创建对象实例,而客户端无需直接创建对象,只需要通过工厂类来获取所需的对象。简单工厂模式包含以下几个角色:工厂类(Factory):负责创建对象实例的类。产品类(Produc......
  • vue3笔记 ref标签 04
    储存标记中的内容<template><divclass="about"><h1ref="Holly">你好</h1><button@click="hhh">点击输出上述h1</button></div></template><scriptlang="ts"setup>i......
  • abc304E 加一条边后是否仍为好图
    给一张n个点m条边的无向图,另外给出k组约束条件(x[i],y[i]),要求点x[i]不能与y[i]连通,满足全部k组条件的图称为好图。原图为好图,现在给出q组独立的询问,每组询问给定(u,v),问如果在u和v之间加一条边,是否为好图?思路:先把图读进来,得到一些连通块,然后将约束条件用set存起来,在处理询问时,检......
  • 洛谷题单指南-搜索-P2404 自然数的拆分问题
    原题链接:https://www.luogu.com.cn/problem/P2404题意解读:将整数拆成若干数相加,按字母序输出,可以转换成从小到大往数组填数的问题,直到填的数之和等于n。解题思路:通过DFS,每次填一个数,填数时从1~n-1逐个填注意两个条件不能继续DFS:1、将填的数之和超过n2、将填的数小于上一次填......
  • 全新QSiC 1200V 模块:GCMS020A120S1-E1、GCMS040A120S1-E1、GCMX020B120S1-E1、GCMS020
    全新QSiC1200VSOT-227SiC模块,提升能源标准,这些超高效模块支持电动汽车、医疗电源和太阳能大功率应用的创新设计。特点低开关损耗低结至外壳热阻非常坚固,易于安装直接安装到散热器上(隔离封装)超低损耗的高频操作SiCSBDs的零反向恢复电流SiCMOSFETs的小关断尾电流低杂散电感......
  • 0xC004F069错误的解决方案
    如果是评估版本,则需要先把评估版本升级为正式版本,才能正确的使用。1.管理员模式运行cmd,输入命令:DISM/online/Get-CurrentEdition,得到结果:部署映像服务和管理工具版本:10.0.14393.0映像版本:10.0.14393.0当前版本为:当前版本:ServerDatacenterEval操作成功完成。2.输入命......
  • 【实战技能】简单易实现的SWD接口烧录目标板挂载的EEPROM,支持AT24C02/04/08/16/32/64/
    之前针对外部SPIFlash的SWD接口烧写,制作过一期专题视频教程。产品生产时,不仅SPIFlash,有时候希望烧录目标板程序后,将EERPOM里面的参数也通过SWD接口存储进去,这样就不再需要大家单独再接上EEPROM的I2C接口烧录了,产品生产比较省事。针对这个问题就花了些时间,制作了下EEPROM的烧写......
  • .NET Core WebAPI项目部署iis后Swagger 404问题解决
    .NETCoreWebAPI项目部署iis后Swagger404问题解决前言之前做了一个WebAPI的项目,我在文章中写到的是Docker方式部署,然后考虑到很多初学者用的是iis,下面讲解下iis如何部署WebAPI项目。环境准备iisASPNETCoreModuleV2重点.NETCoreRuntimeiis的配置这里就不讲了,主要讲解......
  • Ubuntu22.04中的LibreOffice如何设置中文
    LibreOffice版本Version:7.3.7.2/LibreOfficeCommunityBuildID:30(Build:2)设置方法打开LibreOffice,进入软件的操作界面中。在工具栏中点击Tools,然后在下拉选项中找到Options进入到设置的界面。在Options的页面中,找到Language的选项。这个选项就是语言设置。......