且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Unity【话大】设计模式之抽象工厂

更新时间:2022-03-17 02:40:29

前言:笔者在最开始写程序的时候经常会遇到一种情况,例如更改一个字段、或者添加一种小功能,就要把原来写过的东西几乎废弃掉,或者更改大量以前写过的代码。又或者自己写的东西时间久了再去回顾,完全找不到到时为什么这么写的头绪,如果遇到了Bug更是无法快速定位在哪里小范围出现的问题。如果你也经常遇到这种问题,就说明你现阶段非常需要学习下设计模式了

在网上经常说的设计模式有23种,也有一些更多的设计模式,无非也是从这些设计模式中变种而来。如果让笔者来形容什么是设计模式,我认为设计模式是:一种思想,一种模式,一种套路,一种解决问题的高效策略

举个生活中的列子:你需要从家去公园,虽然都是从A点到B点,但目的是着急取东西,你会用代步工具快速到达,但如果仅仅是打发时间,完全可以散步去。用代步工具和散步本身没有绝对的对错,只是根据当时的需求采取的策略。设计模式这种思想,就是根据你当时的需求给你提供最高效的策略。



有说的不正确或者不准确的地方欢迎留言指正


有什么有趣的写作技巧或者想法欢迎大家给我留言,大家的帮助是我写下去最有效的动力



今天笔者为大家介绍工厂三姐妹中的最后一种------【抽象工厂】

在这之前,先给大家介绍一个概念,产品簇,她是这样定义的:产品簇(Product family)指具有相同或相似的功能结构或性能,共享主要的产品特征、组件或子结构,并通过变型配置来满足特定市场的一组产品的聚类。

这么说大家可能不是很好理解,那么举个栗子,如下图

Unity【话大】设计模式之抽象工厂

看下图~~~

Unity【话大】设计模式之抽象工厂

单从上图例子所示,谷歌和百度都具有搜索、云计算、人工智能等相似的结构,这种相似产品结构的集合就是产品簇。原来我们使用的工厂方法主要是产生不同的产品,如不同的搜索引擎,不同的云计算。不同的人工智能。今天说的抽象工厂,是产生不同的产品簇,也就是生产谷歌或者百度。

示例代码如下

接口及产品

public interface ISearch { }
public interface ICloudComputing { }
public interface IAI { }
public class GoogleSearch : ISearch { }
public class GoogleCloudComputing : ICloudComputing { }
public class GoogleAI : IAI { }


public class BaiduSearch : ISearch { }
public class BaiduCloudComputing : ICloudComputing { }
public class BaiduAI : IAI { }

抽象基类类工厂及实现工厂

public abstract class AbstractFactory
{
    public abstract ISearch CreatSearch();
    public abstract ICloudComputing CreatCloudComputing();
    public abstract IAI CreatSAI();
}


public class FactoryGoogle : AbstractFactory
{
    public override ICloudComputing CreatCloudComputing()
    {
        return new GoogleCloudComputing();
    }

    public override IAI CreatSAI()
    {
        return new GoogleAI();
    }

    public override ISearch CreatSearch()
    {
        return new GoogleSearch();
    }

}


public class FactoryBaidu : AbstractFactory
{
    public override ICloudComputing CreatCloudComputing()
    {
        return new BaiduCloudComputing();
    }

    public override IAI CreatSAI()
    {
        return new BaiduAI();
    }

    public override ISearch CreatSearch()
    {
        return new BaiduSearch();
    }
}

使用方式如下

    public void TestAbstractFactory()
    {
        AbstractFactory googleFactory = new FactoryGoogle();
        googleFactory.CreatCloudComputing();
        googleFactory.CreatSAI();
        googleFactory.CreatSearch();

        AbstractFactory baiduFactory = new FactoryGoogle();
        baiduFactory.CreatCloudComputing();
        baiduFactory.CreatSAI();
        baiduFactory.CreatSearch();
    }


抽象工厂最大的好处就是可以批量生产不同产品的替换和组合

  • 【批量生产】如示例所示,生产搜索、云计算、人工智能产品不需要分别创建不同的工厂,一个工厂全部搞定
  • 【不同产品的替换和组合】如果在项目中我们的后续需求是需要一个混合产品,例如百度的搜索搭配谷歌的AI和云计算,又或者需要百度的索索,谷歌的AI和阿里的云计算,我们只需要新建一个混合工厂,然后添加阿里的云计算即可,原来的“产品”都可以复用。

当然,有优点也就有缺点

  • 如果结构更改(抽象工厂基类更改),那么所有实现的工厂都需要更改,这种变动是很难让人接受的
  • 灵活性也没有工厂方法灵活,想用哪个产品就用哪个产品

抽象工厂模式,(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

总结

  • 工厂模式主要是面向产品的创建,把创建由上层的业务逻辑转移到下层
  • 简单工厂简单粗暴,switch..case轻松划分
  • 工厂方法灵活多用,增增减减利于维护
  • 抽象工厂批量生产,产品搭配还不浪费

所以说,工厂三姐妹简单工厂工厂方法和抽象工厂用哪个更适合你现在的项目需求,这就仁者见仁智者见智了~~~