C#简述何为工厂模式

11 篇文章 0 订阅
4 篇文章 0 订阅

前言

学习设计模式-工厂模式,解决了简单工厂模式的缺点。

定义

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

说明介绍

我们还那万达商场做例子,简单工厂模式中,我们把店家当作是我们的选择之一,我们在换一种角度思考。
万达商场中一开始店家没有入驻的时候,时空的,但是它预留了很多店家的位置,需要别人进行入驻操作。
这个状态,我们可以理解成工厂模式的一种实现。这
里万达提供的店家门面,相当于我们程序中的一个个接口信息,只不过这些接口是没有实现的。
具体要实现那些,我们要看那些店家入驻。

代码示例

 	/// <summary>
    /// 万达抽象类
    /// </summary>
    public abstract class WanDa
    {
        // 用户进行的购买操作
        public abstract void Buy();
    }

 	/// <summary>
    /// 购买食物
    /// </summary>
    public class BuyFood : WanDa
    {
        public override void Buy()
        {
            Console.WriteLine("购买食物");
        }
    }
    /// <summary>
    /// 购买衣服
    /// </summary>
    public class BuyClothes: WanDa
    {
        public override void Buy()
        {
            Console.WriteLine("购买衣服");
        }
    }

    /// <summary>
    /// 抽象工厂类 -工厂模式实现的重要类
    /// </summary>
    public abstract class Creator
    {
        // 工厂方法
        public abstract WanDa BuySomeThing();
    }

    /// <summary>
    /// 购买食物-工厂类
    /// </summary>
    public class BuyFoodFactory:Creator
    {
        /// <summary>
        /// 负责购买食物的超市/或者店家
        /// </summary>
        /// <returns></returns>
        public override Food BuySomeThing()
        {
            return new BuyFood();
        }
    }

    /// <summary>
    /// 购买衣服-工厂类
    /// </summary>
    public class BuyClothesFactory:Creator
    {
        /// <summary>
        /// 负责创建购买衣服的店家
        /// </summary>
        /// <returns></returns>
        public override Food BuySomeThing()
        {
            return new BuyClothes();
        }
    }


    /// <summary>
    /// 客户进入万达商场了
    /// </summary>
    static void Main(string[] args)
    {
          // 初始化购买食物,购买衣服的店家()
          Creator buyFood = new BuyClothesFactory();
          Creator buyClothes = new BuyClothesFactory();

          // 开始购买食物
          WanDa food = buyFood.BuySomeThing();
          food.Buy();

          //开始购买衣服
          WanDa clothes= buyClothes.BuySomeThing();
          clothes.Buy();

          Console.Read();
      }



使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。
例如:增加一个购买家具的店家,实现购买
而不用像简单工厂模式中那样去修改工厂类中的实现(具体指添加case语句)。具体代码为:

	/// <summary>
    /// 购买家具
    /// </summary>
    public class BuyFurniture : WanDa
    {
        /// <summary>
        /// 重写抽象类中的方法
        /// </summary>
        public override void Buy()
        {
            Console.WriteLine("肉末茄子好了");
        }
    }
 	/// <summary>
    /// 购买家具工厂类,负责实现售卖家具的效果
    /// </summary>
    public class BuyFurnitureFactory : Creator
    {
        /// <summary>
        /// 负责售卖家具
        /// </summary>
        /// <returns></returns>
        public override Food BuySomeThing()
        {
            return new BuyFurniture ();
        }
    }


    /// <summary>
    /// 客户进入万达商场了
    /// </summary>
    static void Main(string[] args)
    {
          // 初始化购买食物,购买衣服的店家()
          Creator buyFood = new BuyClothesFactory();
          Creator buyClothes = new BuyClothesFactory();
          Creator buyFurniture= new BuyFurnitureFactory();

          // 开始购买食物
          WanDa food = buyFood.BuySomeThing();
          food.Buy();

          //开始购买衣服
          WanDa clothes= buyClothes.BuySomeThing();
          clothes.Buy();
          
          //开始购买家具
          WanDa furniture= buyFurniture.BuySomeThing();
          furniture.Buy();
 
          Console.Read();
      }

优缺点以及应用场景

优点:
工厂方法模式是为了克服简单工厂模式的缺点(主要是为了满足OCP)而设计出来的。
简单工厂模式的工厂类随着产品类的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类只完成单一任务,代码简洁。
工厂方法模式完全满足OCP,即它有非常良好的扩展性
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:
每次增加一个产品时,都需要增加一个具体类和对象实现工厂,
使得系统中类的个数成倍增加,
在一定程度上增加了系统的复杂度,
同时也增加了系统具体类的依赖。

应用场景:
1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
等。。。
常用于数据库调整,毕竟数据库种类会比较多每家公司选择的又都不一样,所以需要了解一下

尾语

工厂模式算是我们项目中常用的一种模式了,主要的应用场景也是数据库访问的地方,可以达到一种动态切换数据库访问的效果。实际应用频率还是比较高的,就算不切换,也会预留,方便后期扩展(手动机智)
文章参考:
C#设计模式(3)——工厂方法模式
工厂模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值