小白设计模式入门(4)—— 抽象工厂模式

一、引言

从简单工厂模式->工厂模式->抽象工厂模式,都是为了克服之前的一些缺点而设计的。工厂方法模式具有很好的可扩展性,但是一个工厂只创建单个产品这样的例子很少,常常需要创建多个系列的产品。抽象工厂能很好地解决一系列产品创建的问题。

二、实现示例

抽象工厂示例

    #region 自己写的抽象工厂
    /// <summary>
    /// 抽象工厂,将所有设备抽象出来
    /// </summary>
    public interface IEquipAbstractFactory
    {
        ICamera CreateCamera();
        IRadar CreateRadar();
    }

    /// <summary>
    /// 摄像头接口
    /// </summary>
    public interface ICamera : IEquip
    {
        new string GetName();
    }

    /// <summary>
    /// 卫星定位设备接口
    /// </summary>
    public interface IRadar : IEquip
    {
        new string GetName();
    }

    /// <summary>
    /// 第一个航行器
    /// </summary>
    public class FirstVehicleFactory: IEquipAbstractFactory
    {
        public ICamera CreateCamera()
        {
            return new HikVision();
        }

        public IRadar CreateRadar()
        {
            return new LaserRadar();
        }
    }

    public class HikVision: ICamera
    {
        public string GetName()
        {
            return nameof(HikVision);
        }
    }

    public class LaserRadar : IRadar
    {
        public string GetName()
        {
            return nameof(LaserRadar);
        }
    }
    #endregion

新增工厂


    /// <summary>
    /// 现在增加第二个航行器
    /// </summary>
    public class SecondVehicleFactory : IEquipAbstractFactory
    {
        public ICamera CreateCamera()
        {
            return new Uniview();
        }

        public IRadar CreateRadar()
        {
            return new MillimeterWaveRadar();
        }
    }

    public class Uniview : ICamera
    {
        public string GetName()
        {
            return nameof(Uniview);
        }
    }

    public class MillimeterWaveRadar : IRadar
    {
        public string GetName()
        {
            return nameof(MillimeterWaveRadar);
        }
    }

调用示例


    public class AbstractFactoryClient
    {
        public static void Test()
        {
            IEquipAbstractFactory e1 = new FirstVehicleFactory();
            var c1 = e1.CreateCamera();
            var r1 = e1.CreateRadar();
            
            string tmp = "";
            tmp = c1.GetName();
            Console.WriteLine(tmp);
            tmp = r1.GetName();
            Console.WriteLine(tmp);

            IEquipAbstractFactory e2 = new SecondVehicleFactory();
            var c2 = e2.CreateCamera();
            var r2 = e2.CreateRadar();

            tmp = c2.GetName();
            Console.WriteLine(tmp);
            tmp = r2.GetName();
            Console.WriteLine(tmp);
        }
    }

三、分析

优点:
抽象工厂模式将具体产品的创建延迟到具体工厂的子类中,这样将对象的创建封装起来,可以减少客户端与具体产品类之间的依赖,从而使系统耦合度低,这样更有利于后期的维护和扩展

缺点:
抽象工厂模式很难支持新种类产品的变化。这是因为抽象工厂接口中已经确定了可以被创建的产品集合,如果需要添加新产品,此时就必须去修改抽象工厂的接口,这样就涉及到抽象工厂类的以及所有子类的改变,这样也就违背了“开发——封闭”原则。

场景(前提):

  • 1、一个系统不要求依赖产品类实例如何被创建、组合和表达的表达,这点也是所有工厂模式应用的前提。
  • 2、这个系统有多个系列产品,而系统中只消费其中某一系列产品
  • 3、系统要求提供一个产品类的库,所有产品以同样的接口出现,客户端不需要依赖具体实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值