当前位置: 首页 > article >正文

设计模式(二)-创建者模式(3)-抽象工厂模式

一、为什么需要抽象工厂模式?

在工厂模式中,我们需要定义多个继承于共同工厂抽象基类的工厂子类,这些子类负责创建一个对应的对象。工厂模式存在一个缺点就是:每次扩展新的工厂子类,就会增加系统的复杂度。

如果我们知道把所有产品(比如车)分为几个产品族(比如自行车族、汽车族),那么工厂子类就对应指定的产品族进行“批量”创建对象。若有新的产品,则工厂子类创建该新产品对象。(工厂子类内部逻辑,类似于简单工厂模式)

抽象工厂模式 ,类似于简单工厂模式和工厂模式混合运用而成的模式。(参考上篇文章“工厂模式”的最后一个代码例子)

优点: 不需要每次定义一个新的产品类时,就要扩展新的工厂子类。工厂子类提供一个产品族中多个对象的创建工作,客户端可以方便使用某个产品族中的对象。

缺点: 产品族扩展难。要增加一个新系列的某一产品,要定义产品抽象类、产品实现类,工厂抽象基类,工厂子类。

【角色】
某系列抽象基类: 用以定义某产品族的特征和行为的抽象接口。
某系列的某产品实现类: 继承某系列抽象基类,用以实现某系列里某产品的特征和行为的具体类。
工厂抽象基类: 用以定义创建对象的特征的抽象接口。特征行为包括提供某系列产品的抽象方法。
工厂子类: 对对应的实现类进行实例化。实现提供某系列某产品的方法。

请添加图片描述

二、例子

需求: 假定某些地方的主要交通工具有自行车和汽车。为了满足人们交通便利的需求,现有XX公司和YY公司这两家公司,对市场推行了两种运营模式:租车和共享车。也就是说,租车和共享车是这两家公司所推广的两个产品系列业务,即两个产品族。

1)定义产品族和具体产品


//共享车系列(产品族)
    public abstract class Share
    {
        public abstract void Move();
    }
    
//租借车系列
    public abstract class Rent
    {
        public abstract void Move();
    }

//XX公司-共享-自行车
    public class XXBikeShare : Share
    {
        public override void Move(){
            Console.WriteLine("Share XXBike move.");
        }
    }
    
//XX公司-共享-汽车
    public class XXCarShare : Share
    {
        public override void Move(){
            Console.WriteLine("share XXCar move.");
        }
    }
    
//XX公司-租借-自行车
    public class XXBikeRent : Rent
    {
        public override void Move(){
            Console.WriteLine("Rent XXBike move.");
        }
    }

//XX公司-租借-汽车
    public class XXCarRent : Rent
    {
        public override void Move(){
            Console.WriteLine("Rent XXCar move.");
        }
    }

//YY公司-共享-自行车
    public class YYBikeShare : Share
    {
        public override void Move() {
            Console.WriteLine("share YYBike move.");
        }
    }

//YY公司-共享-汽车
    public class YYCarShare : Share
    {
        public override void Move() {
            Console.WriteLine("share YYCar move.");
        }
    }

//YY公司-租借-自行车
    public class YYBikeRent : Rent
    {
        public override void Move(){
            Console.WriteLine("Rent YYBike move.");
        }
    }

//YY公司-租借-汽车
    public class YYCarRent : Rent
    {
        public override void Move(){
            Console.WriteLine("Rent YYCar move.");
        }
    }

2)定义工厂基类和工厂子类


//定义提供两个产品族的抽象方法
    public abstract class Factory
    {
        public abstract Share ProvideS(string args);
        public abstract Rent ProvideR(string args);
    }

//XX公司落实产品业务:租借和共享
    public class XXFactory : Factory
    {
        public override Share ProvideS(string args)
    {
            Share share = null;
            switch (args)
            {
                case "XXBike":
                    share = new XXBikeShare(); break;
                case "XXCar":
                    share = new XXCarShare(); break;
                default:
                    throw new ArgumentException("args is Invalid. new obj failed.");
            }

            return share;
        }

        public override Rent ProvideR(string args)
        {
            Rent rent = null;
            switch (args)
            {
                case "XXBike":
                    rent = new XXCarRent(); break;
                case "XXCar":
                    rent = new XXBikeRent(); break;
                default:
                    throw new ArgumentException("args is Invalid. new obj failed.");
            }

            return rent;
        }
    }
    
//YY公司落实产品业务:租借和共享
    public class YYFactory : Factory
    {
        public override Share ProvideS(string args)
        {
            Share share = null;
            switch (args)
            {
                case "YYBike":
                    share = new YYBikeShare(); break;
                case "YYCar":
                    share = new YYCarShare(); break;
                default:
                    throw new ArgumentException("args is Invalid. new obj failed.");
            }

            return share;
        }

        public override Rent ProvideR(string args)
        {
            Rent rent = null;
            switch (args)
            {
                case "YYBike":
                    rent = new YYBikeRent(); break;
                case "YYCar":
                    rent = new YYCarRent(); break;
                default:
                    throw new ArgumentException("args is Invalid. new obj failed.");
            }

            return rent;
        }
    }

3)在客户端使用


class Program
    {
        static void Main(string[] args)
        {
            Factory xx = new XXFactory();
            Factory yy = new YYFactory();

            var sharexxCar = xx.ProvideS("XXCar");
            sharexxCar.Move();

            var rentyyBike = yy.ProvideR("YYBike");
            rentyyBike.Move();

            Console.ReadLine();
        }
    }


http://www.kler.cn/a/134697.html

相关文章:

  • Vulnhub靶场案例渗透[8]- HackableII
  • 策略模式、状态机详细解读
  • 前端vue 列表中回显并下拉选择修改标签
  • leetcode-位运算题型
  • 2023年MathorCup数学建模B题城市轨道交通列车时刻表优化问题解题全过程文档加程序
  • Zotero 6.0 安装包及安装教程
  • AI监管规则:各国为科技监管开辟了不同的道路
  • 【Mysql】基于MySQL协议的抓包工具
  • 使用Docker/K8S/Helm部署项目流程
  • Revive开发商加入VR开源标准OpenXR
  • 音频录制实现 绘制频谱
  • PyInstaller 如何 将第三方库打包到可执行文件
  • spring boot @Autowired 注入的服务为null
  • 1.索引的本质
  • 斯坦福机器学习 Lecture2 (假设函数、参数、样本等等术语,还有批量梯度下降法、随机梯度下降法 SGD 以及它们的相关推导,还有正态方程)
  • P2444 [POI2000] 病毒
  • 1688商品详情原数据(2023年11月最新版)
  • MySQL集群高可用架构之MMM
  • 八股文-TCP的四次挥手
  • “智能与未来”2024世亚国际智能机器人展会(简称:世亚智博会)
  • Swin Transformer
  • 云端援手:智能枢纽应对数字资产挑战 ——华为云11.11应用集成管理与创新专区优惠限时购
  • 图神经网络:消息传递算法
  • 使用JDK自带java.util.logging.Logger引起的冲突问题
  • HTTP(Hypertext Transfer Protocol)协议
  • Cadence virtuoso drc lvs pex 无法输入