C# 工厂模式

这篇具有很好参考价值的文章主要介绍了C# 工厂模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在C#中,工厂模式通过定义一个公共接口或抽象类来创建对象,而具体的对象创建则由工厂类来实现。 工厂模式主要包含三个角色:

1. 抽象产品(Abstract Product):定义了产品的接口,具体产品需要实现这个接口。

2. 具体产品(Concrete Product):实现了抽象产品接口的具体类。

3. 工厂(Factory):负责创建具体产品的工厂类,通常包含一个创建产品的方法。

工厂模式的优点:

封装性:工厂模式隐藏了创建对象的细节,只需要知道创建对象的入口,而无需关注创建过程,它提供了把对象创建与对象使用分离的方法。
可扩展性:在工厂模式中,添加一个新的产品类型,只需要在工厂类中添加一个创建新产品的方法,不会影响到现有代码。
复杂对象的创建:工厂模式允许创建复杂的对象,把对象的创建过程和使用过程分开,可以使代码更容易维护。
解耦:工厂模式减少了客户端和实际产品类之间的耦合,可以独立更改实现,不会影响到其他部分。
总之,工厂模式是一种常用的对象创建型模式,具有封装性,可扩展性,复杂对象的创建和解耦等优点,适用于解决复杂对象创建问题。

工厂模式的缺点:

增加了系统复杂度:因为要把创建对象的过程抽象成接口,所以会增加系统复杂度。
父类被污染:由于工厂模式中的工厂类继承自抽象类,如果需要扩展父类的功能,可能会把父类的代码污染。
不符合开闭原则:工厂模式的实现要求修改工厂类代码,在添加新产品时可能需要修改工厂类,这不符合开闭原则。
总的来说,工厂模式虽然有一些缺点,但是它还是一种非常有用的设计模式,在很多情况下都可以帮助我们简化代码,提高代码质量。

上面这些介绍,几乎都是没什么用的文案,目的是为了做人类高质量文章,各位可以不看,当然你想看也没问题,只是看了和没看效果是一样的。

二、代码的实现

新建一个控制台项目,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 工厂模式
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Factory factory = new Factory();

            // 创建具体产品A
            IProduct productA = factory.CreateProduct("A");
            productA.Operation();  // 输出:具体产品A的操作

            // 创建具体产品B
            IProduct productB = factory.CreateProduct("B");
            productB.Operation();  // 输出:具体产品B的操作

            Console.ReadKey();
        }
    }

    // 抽象产品接口
    public interface IProduct
    {
        void Operation();
    }

    // 具体产品类A
    public class ConcreteProductA : IProduct
    {
        public void Operation()
        {
            Console.WriteLine("具体产品A的操作");
        }
    }

    // 具体产品类B
    public class ConcreteProductB : IProduct
    {
        public void Operation()
        {
            Console.WriteLine("具体产品B的操作");
        }
    }

    // 工厂类
    public class Factory
    {
        public IProduct CreateProduct(string productType)
        {
            switch (productType)
            {
                case "A":
                    return new ConcreteProductA();
                case "B":
                    return new ConcreteProductB();
                default:
                    throw new ArgumentException("无效的产品类型");
            }
        }
    }
}

运行:

C# 工厂模式,C# 设计模式,c#

工厂模式的代码也是非常的简单,这里就不做解析了,下面直接上一个案例吧。 

三、案例

由于工厂模式的主要作用是创建实例,那么就以公司的年会抽奖为案例吧,首先,随机设置一个抽奖人,然后由系统随机奖品,奖品有现金,手机,平板电脑,抽奖完成后,公布抽奖结果。

新建一个 Winform 项目,将项目的输入类型改为控制台输出,你可能会问:“这么简单的操作干嘛介绍啊”?你还别说,上次就有人问我,你这是控制台项目还是 Winform 项目,控制台从哪里出来的,也不写清楚?

C# 工厂模式,C# 设计模式,c#

界面就两个按钮,源码我就不上传了

C# 工厂模式,C# 设计模式,c#

新建一个类 Prize,加入下面代码,下面好几个类写在一起了,我也懒的分了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 工厂模式案例
{
    /// <summary>
    /// 奖品的类型
    /// </summary>
    public enum PrizeType
    {
        /// <summary>
        /// 现金
        /// </summary>
        Money,
        /// <summary>
        /// 手机
        /// </summary>
        MobilePhone,
        /// <summary>
        /// 平板电脑
        /// </summary>
        Ipad
    }

    /// <summary>
    /// 奖品
    /// </summary>
    public abstract class Prize
    {
        /// <summary>
        /// 数量
        /// </summary>
        public int Number { get; set; }
        /// <summary>
        /// 获奖人
        /// </summary>
        public string Awardee { get; set; }
        /// <summary>
        /// 奖品类型
        /// </summary>
        public PrizeType PrizeTypes { get; set; }

        /// <summary>
        /// 随机数
        /// </summary>
        public Random Randoms { get; private set; } = new Random();
        /// <summary>
        /// 操作
        /// </summary>
        public abstract void Operation();
        /// <summary>
        /// 设置获奖人
        /// </summary>
        /// <param name="Awardee"></param>
        public abstract void SetAwardee(string Awardee);
    }

    /// <summary>
    /// 现金
    /// </summary>
    public class Money : Prize
    {
        public override void Operation()
        {
            Number = Randoms.Next(100, 1000);
            PrizeTypes =  PrizeType.Money;
            Console.WriteLine("得到奖品 类型:{0},数量是:{1}", PrizeTypes, Number);
        }

        public override void SetAwardee(string awardee)
        {
            Awardee = awardee;
            Console.WriteLine("当前奖品的获得者是:{0}", awardee);
        }
    }

    /// <summary>
    /// 手机
    /// </summary>
    public class MobilePhone : Prize
    {
        public override void Operation()
        {
            Number = Randoms.Next(1, 3);
            PrizeTypes = PrizeType.MobilePhone;
            Console.WriteLine("得到奖品 类型:{0},数量是:{1}", PrizeTypes, Number);
        }

        public override void SetAwardee(string awardee)
        {
            Awardee = awardee;
            Console.WriteLine("当前奖品的获得者是:{0}", awardee);
        }
    }

    /// <summary>
    /// 平板电脑
    /// </summary>
    public class Ipad : Prize
    {
        public override void Operation()
        {
            Number = Randoms.Next(1, 3);
            PrizeTypes = PrizeType.Ipad;
            Console.WriteLine("得到奖品 类型:{0},数量是:{1}", PrizeTypes, Number);
        }

        public override void SetAwardee(string awardee)
        {
            Awardee = awardee;
            Console.WriteLine("当前奖品的获得者是:{0}", awardee);
        }
    }

    public class Factory
    {
        public static Prize CreateProduct(PrizeType prizeType)
        {
            switch (prizeType)
            {
                case PrizeType.Money:
                    return new Money();
                case PrizeType.MobilePhone:
                    return new MobilePhone();
                case PrizeType.Ipad:
                    return new Ipad();
                default:
                    return null;
            }
        }

        private Factory() { }
    }
}

Form1 的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 工厂模式案例
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //随机数
        private Random Randoms = new Random();
        //抽奖人列表
        private List<string> NameList = new List<string>() { "张三", "李四", "老王", "柱子", "狗剩", "铁蛋" };
        //当前的抽奖人
        private string Awardee = string.Empty;
        //奖品类型枚举的长度
        private int PrizeTypeCount = 0;


        private void Form1_Load(object sender, EventArgs e)
        {
            PrizeTypeCount = System.Enum.GetNames(new PrizeType().GetType()).Length;
        }

        //抽奖人
        private void button1_Click(object sender, EventArgs e)
        {
            int index = Randoms.Next(0, NameList.Count);
            Awardee = NameList[index];
            Console.WriteLine("当前的抽奖人是:{0}", Awardee);
        }

        //抽奖
        private void button2_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(Awardee))
            {
                Console.WriteLine("请先确认抽奖人");
                return;
            }

            int index = Randoms.Next(0, PrizeTypeCount);
            PrizeType prizeType = (PrizeType)index;
            Prize prize = Factory.CreateProduct(prizeType);
            prize.Operation();
            prize.SetAwardee(Awardee);
        }
    }
}

运行:

C# 工厂模式,C# 设计模式,c#

这样一个简单的抽奖系统就实现了,有什么疑问或者建议,欢迎留言评论。

结束

如果这个帖子对你有所帮助,欢迎 关注 + 点赞 + 留言

end文章来源地址https://www.toymoban.com/news/detail-670790.html

到了这里,关于C# 工厂模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Factory Method Pattern 工厂方法模式简介与 C# 示例【创建型】【设计模式来了】

    一句话解释:   实体类和工厂类均为单独实现,不影响已实现的类,方便扩展。 工厂方法模式(Factory Method Pattern)是一种创建型模式,它允许客户端通过工厂方法来创建对象,而不是直接使用构造函数。这样可以让客户端代码更加灵活,同时保持实现的独立性。工厂方法

    2024年02月06日
    浏览(42)
  • Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】

    一句话解释:   客户类和工厂类严格分工,客户类只需知道怎么用,处理逻辑交给工厂类。 简单工厂模式(Simple Factory Pattern)是日常开发中常用的设计模式。其是一种简单的创建型模式,它通过一个工厂类来创建对象,客户端只需要知道如何使用工厂类,而不需要知道对

    2024年02月06日
    浏览(52)
  • Abstract Factory Pattern 抽象工厂模式简介与 C# 示例【创建型】【设计模式来了】

    一句话解释:   提供一个接口,以创建一系列相关或相互依赖的抽象对象,而无需指定它们具体的类。 (将一系列抽象类装进接口,一次接口实现,就必须实例化这一系列抽象类) 抽象工厂模式(Abstract Factory Pattern)是一种创建型模式。它用于创建一组相关对象的家族。

    2024年02月07日
    浏览(45)
  • 自学设计模式(简单工厂模式、工厂模式、抽象工厂模式)

    使用工厂模式来生产某类对象(代码简化且容易维护,类之间有血缘关系,可以通过工厂类进行生产); 简单工厂模式(用于创建简单对象) 对于简单工厂模式,需要的工厂类只有一个; 在工厂类中的公共成员函数来创建所需对象; 工厂模式 简单工厂模式会违反开放封闭

    2024年02月11日
    浏览(43)
  • 反射和工厂设计模式---工厂设计模式

    工厂模式(Factory Pattern)是开发中比较常用的设计模式之一。 它属于创建型模式(单例模式就是创建型模式的一种),这种模式让我们 在创建对象时不会直接暴露创建逻辑,而是通过使用一个共同的接口来完成对象的创建 。 工厂模式可以分为三种,分别是简单工厂模式、工厂方

    2024年02月13日
    浏览(46)
  • 设计模式(二)、工厂模式--简单工厂模式

    简单工厂模式:又叫做静态工厂方法模式,是由一个工厂对象决定创建出哪一种产品类的实例。 需要注意的是:简单工厂模式属于创建型模式,但不属于23种GOF设计模式之一  该模式主要有以下几个模块构成: 具体说明结合代码,如下: 代码中主要是有一个cake接父类,两个

    2024年02月13日
    浏览(50)
  • 设计模式(二)、工厂模式--工厂方法模式

    工厂方法模式是一种常用的创建型设计模式。它解决了简单工厂模式的问题:如违反了开闭原则,其次可以用于更复杂的结构 它的核心结构有四个角色  抽象工厂;具体工厂;抽象产品;具体产品 抽象工厂(抽象类或接口)不在负责具体的创建过程,即具体的代码实现。只制定

    2024年02月16日
    浏览(38)
  • 【设计模式】单例模式、工厂方法模式、抽象工厂模式

    1. 单例模式 (Singleton Pattern): 场景: 在一个应用程序中,需要一个全局唯一的配置管理器,确保配置信息只有一个实例。 2. 工厂方法模式 (Factory Method Pattern): 场景: 创建一组具有相似功能但具体实现不同的日志记录器。 3. 抽象工厂模式 (Abstract Factory Pattern): 场景: 创建不同

    2024年01月15日
    浏览(62)
  • 设计模式-工厂设计模式

    在简单工厂模式的基础上进一步的抽象化 具备更多的可扩展和复用性,增强代码的可读性 使添加产品不需要修改原来的代码,满足 开闭原则 优点 符合 单一职责 ,每个工厂只负责生产对应的产品 符合 开闭原则 ,添加产品只需添加对应的产品类和工厂类 使用者只需要知道

    2024年02月11日
    浏览(47)
  • 设计模式-简单工厂模式(静态工厂模式)java实现

    简单工厂模式根据所 提供的参数 数据返回几个可能类中的一个类的实例。通常返回的类都有一个公共的父类和公共的方法。   意图 提供一个类,负责根据一定的条件创建某一具体类的实例。同时使用工厂模式也是为了隐藏创建对象的过程 角色及其职责 (1)工厂(Creator)角色

    2024年02月13日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包