前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之工厂模式系列

设计模式之工厂模式系列

作者头像
宿春磊Charles
发布2022-03-29 10:04:47
1550
发布2022-03-29 10:04:47
举报
文章被收录于专栏:DotNet 致知

在开发中,工厂模式为我们提供了一种松耦合的形式,在一些需要频繁构造比较复杂的对象时,就可以使用工厂模式,通过对象工厂为我们提供实例,这样在后期维护的时候可以统一的对实例对象的过程进行管理升级。

工厂模式分为三种:简单工厂模式,工厂方法模式,抽象工厂模式。

简单工厂模式:

先看一下代码:

代码语言:javascript
复制
static class SimpleFactoryPattern
{
    public static IProduct makeProduct(ProductClass pc)
    {
        //返回对应的实例
        switch (pc)
        {
            case ProductClass.one: return new ProductOne();
            case ProductClass.two: return new ProductTo();
        }
        throw new Exception("no this product");
    }
}

enum ProductClass
{
    one,
    two,
}
//将产品抽象
interface IProduct
{
    void Production();
}

class ProductOne : IProduct
{
    public void Production()
    {
        Console.WriteLine("产品1");
    }
}

class ProductTo : IProduct
{
    public void Production()
    {
        Console.WriteLine("产品2");
    }
}

简单工厂模式的代码逻辑比较容易理解,它的主要优点是:客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确,客户端无需知道所创建具体产品的类名,只需知道参数即可,但是它的缺点也显而易见:简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。

因此,经过进一步发展,工厂方法模式出现了。

工厂方法模式:

工厂方法模式是对简单工厂模式的进一步抽象化。它将工厂也部分抽象出来,对应的每个工厂只生产一个实例。用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程,对于新产品的创建,只需多写一个相应的工厂类,我们下面看一下实现代码:

代码语言:javascript
复制
interface IFactory
{
    IProduct makeProduct();
}

class FactoryMethodPatternOne : IFactory
{
    public IProduct makeProduct()
    {
        return new ProductOne();
    }
}
class FactoryMethodPatternTwo : IFactory
{
    public IProduct makeProduct()
    {
        return new ProductTo();
    }
}

interface IProduct
{
    void Production();
}

class ProductOne : IProduct
{
    public void Production()
    {
        Console.WriteLine("产品1");
    }
}

class ProductTo : IProduct
{
    public void Production()
    {
        Console.WriteLine("产品2");
    }
}

当然,这种逻辑,还是存在着问题,一个工厂只能生产一个类,增加了代码复杂度,而且难以理解,为了更好的完善工厂模式,后来又推出了新的工厂模式:抽象工厂模式。

抽象工厂模式:

抽象工厂将工厂彻底抽象出来,每个抽象工厂可以生产多种相互关联的对象,像华为生产不只生产手机,还生产电脑,平板。下面看一下代码:

代码语言:javascript
复制
interfaceIFactory
{
    IProduct makeCar();
    IProduct makeClothes();
}

class FactoryOne : IFactory
{
    public IProduct makeCar()
    {
       return new BYD();
    }

    public IProduct makeClothes()
    {
       return new Lining();
    }
}

interface IProduct
{
    void Production();
}

class Lining : IProduct
{
    public void Production()
    {
        Console.WriteLine("产品1");
    }
}

class BYD : IProduct
{
    public void Production()
    {
        Console.WriteLine("产品2");
    }
}

但是抽象工厂模式,半违背开发-封闭原则:

  • 当增加一个新的产品族时只需增加一个新的具体工厂,不需要修改原代码,满足开闭原则。
  • 当产品族中需要增加一个新种类的产品时,则所有的工厂类都需要进行修改,不满足开闭原则。

这三个工厂模式,都有自己的应用场景,不必过于纠结其缺点,开发时最合适的就是最好的。

本节到此结束...

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet 致知 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档