设计模式-工厂方法模式

设计模式-工厂方法模式

接上文的简单工厂模式

简单工厂模式中讲到了几条缺点,其中之一便是扩展困难,一旦添加新产品就不得不修改简单工厂方法,违背了设计模式的开闭原则,工厂方法的出现能够解决这个问题。

定义:工厂方法模式定义一个创建产品的接口,将实际创建产品的工作延迟到子类中。

结构:
AbstractFactory (抽象工厂)
提供了创建产品的接口,不负责具体产品的创建,抽象工厂可以是抽象类,也可以是一个接口

ConcreteFactory(具体工厂)
继承 AbstractFactory,实现AbstractFactory 创建对象的接口,负责具体产品的创建。

Product (抽象、接口 产品)
工厂模式所创建的所有对象对应类的父类或接口

Concrete Product (具体产品)
工厂创建的目标

结构上对比简单工厂模式就是将工厂也进行了抽象,可以有多个不同的工厂,每个工厂分别负责创建不同的产品。

同样以汽车工厂为例,在简单工厂中一个工厂可以生产多个类型的汽车,导致一个工厂需要处理不同的逻辑判断,经过结构优化,公司决定对工厂进行拆分,将工厂职责单一化,根据汽车类型建立不同的工厂,于是将一个工厂拆分为如下几个工厂

小轿车工厂
公共汽车工厂
校车工厂

汽车抽象类、接口以及汽车具体类如下

    // 汽车接口
    public interface ICar
    {
        void Print();
    }
    
    // 小轿车
    public class SaloonCar : ICar
    {
        public void Print()
        {
            Console.WriteLine("这是小轿车");
        }
    }

    // 公共汽车
    public class Bus : ICar
    {
        public void Print()
        {
            Console.WriteLine("这是公共汽车");
        }
    }

    // 校车
    public class SchoolBus : ICar
    {
        public void Print()
        {
            Console.WriteLine("这是校车");
        }
    }

抽象工厂/工厂接口,以及具体工厂类如下

    /// <summary>
    /// 汽车工厂接口
    /// </summary>
    public interface ICarFactory
    {
        // 声明创建汽车的接口
        ICar Create();
    }

    // 小轿车的工厂
    public class SaloonCarFactory : ICarFactory
    {
        public ICar Create()
        {
            ICar icar = new SaloonCar();
            return icar;
        }
    }

    // 公共汽车的工厂
    public class BusFactory : ICarFactory
    {
        public ICar Create()
        {
            ICar icar = new Bus();
            return icar;
        }
    }

    // 校车工厂
    public class SchoolBusFactory : ICarFactory
    {
        public ICar Create()
        {
            ICar icar = new SchoolBus();
            return icar;
        }
    }

具体调用如下

    class Customer
    {
        public Customer()
        {
            // 创建一个小轿车的工厂
            SaloonCarFactory saloonCarFactory = new SaloonCarFactory();
            // 小轿车工厂生产小轿车
            ICar saloonCar = saloonCarFactory.Create();
            saloonCar.Print();

            // 创建一个公共汽车的工厂
            BusFactory busFactory = new BusFactory();
            // 公共汽车工厂生产公共汽车
            ICar busCar = busFactory.Create();
            busCar.Print();

            // 创建一个校车的工厂
            SchoolBusFactory schoolBusFactory = new SchoolBusFactory();
            // 校车工厂生产校车
            ICar schoolBus = schoolBusFactory.Create();
            schoolBus.Print();
        }
    }

优点:
(1)用户只需要知道具体工厂的类就可以创建需要的产品,无需知道具体的创建过程
(2)灵活,多一种产品,只需要增加一个相应的工厂类,原有工厂类无需修改

缺点:
(1)类的数量较多,增加一个产品还需要同时增加一个具体工厂类
(2)一个工厂只能生产一种产品
(3)引入了更多的抽象层,增加了系统的抽象性和理解难度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值