• 面向对象编程思想-抽象工厂模式


    一、引言

    在前两篇博客中,工厂方法模式的产生,克服了简单工厂模式随着产品的增加导致工厂类越来越复杂的问题,那么在工厂方法模式中,是不是我们每新增一个新的实例都需要新增一个工厂呢,想一下,在现实生活当然不是啦,工厂已经多元化,会生产一系列的产品(产品族概念产生),显然工厂方法模式的程序设计思想放在这里是不适用的,下面请看我们今天学习的抽象工厂模式是如何解决这个问题的。

    二、抽象工厂模式

    定义:抽象工厂模式把具体产品的创建延迟到具体的工厂中,将某一系列对象的创建封装起来。下面通过一个例子,帮助我们理解抽象工厂模式

    下面是代码demo:

    namespace DNA.Framework.AbstractFactory
    {
      //车子类
    public abstract class BaseCar { public abstract void Run(); } }
    namespace DNA.Framework.AbstractFactory
    {
      //宝马类
    class BMW : BaseCar { public override void Run() { Console.WriteLine("我今天开{0}去上班",this.GetType().Name); } } }
    namespace DNA.Framework.AbstractFactory
    {
      //奔驰类
    class MBZ : BaseCar { public override void Run() { Console.WriteLine("我今天开{0}去上班", this.GetType().Name); } } }
    namespace DNA.Framework.AbstractFactory
    {
      //跑车类
    public abstract class BaseSportsCar { public abstract void MoreRun(); } }
    
    
    namespace DNA.Framework.AbstractFactory
    {
      //宝马系列跑车
    class BMWSportsCar : BaseSportsCar
      {
         public override void MoreRun()
            {
                Console.WriteLine("我今天开{0}去兜风",this.GetType().Name);
            }
        }
    }
    namespace DNA.Framework.AbstractFactory
    {
      //奔驰系列跑车
    class MBZSportsCar : BaseSportsCar { public override void MoreRun() { Console.WriteLine("我今天开{0}去兜风", this.GetType().Name); } } }
    namespace DNA.Framework.AbstractFactory
    {
      //接口工厂类 提供创建一组产品的接口,而不需要关注具体产品是什么
    interface IAbstractFactory { BaseCar GetCar(); BaseSportsCar GetSportsCar(); } }
    namespace DNA.Framework.AbstractFactory
    {
      //宝马工厂类 可以生产普通轿车,也可以生产宝马系列跑车
    class BMWAbstractFactory:IAbstractFactory { public BaseCar GetCar() { return new BMW(); } public BaseSportsCar GetSportsCar() { return new BMWSportsCar(); } } }
    namespace DNA.Framework.AbstractFactory
    {
      //奔驰工厂类
    class MBZAbstractFactory : IAbstractFactory { public BaseCar GetCar() { return new MBZ(); } public BaseSportsCar GetSportsCar() { return new MBZSportsCar(); } } }
    namespace DNA.Framework.AbstractFactory
    {
      //客户端 负责调用不同的工厂 生产不同系列的产品
    class Program { static void Main(string[] args) { IAbstractFactory bmwFactory = new BMWAbstractFactory(); BaseCar bmw = bmwFactory.GetCar(); BaseSportsCar bmwSports = bmwFactory.GetSportsCar(); IAbstractFactory mbzFactory = new MBZAbstractFactory(); BaseCar mbz = mbzFactory.GetCar(); BaseSportsCar mbzSports = mbzFactory.GetSportsCar(); // IAbstractFactory ferrariFactory = new FERRARIAbstractFactory(); // BaseCar ferrari = ferrariFactory.GetCar(); // BaseSportsCar ferrariSports = ferrariFactory.GetSportsCar(); bmw.Run(); bmwSports.MoreRun(); mbz.Run(); mbzSports.MoreRun(); // ferrari.Run(); // ferrariSports.MoreRun(); Console.Read(); } } }

    当有业务需求变化时,比如我们想增加 开着法拉利去上班,开着法拉利系列跑车去兜风,这时只需要增加法拉利的工厂类,负责创建法拉利普通车类和法拉利系列跑车类,增加法拉利类和法拉利跑车类

    namespace DNA.Framework.AbstractFactory
    {
      //法拉利工厂类
    class FERRARIAbstractFactory : IAbstractFactory { public BaseCar GetCar() { return new FERRARI(); } public BaseSportsCar GetSportsCar() { return new FERRARISportsCar(); } } }
    namespace DNA.Framework.AbstractFactory
    {
      //法拉利类
    class FERRARI:BaseCar { public override void Run() { Console.WriteLine("我今天开{0}去上班", this.GetType().Name); } } }
    namespace DNA.Framework.AbstractFactory
    {
      //法拉利跑车类
    class FERRARISportsCar : BaseSportsCar { public override void MoreRun() { Console.WriteLine("我今天开{0}去兜风", this.GetType().Name); } } }

    优点:抽象工厂对于系列产品的变化,扩展非常方便,只需新增具体工厂类及系列产品类。

    缺点:当添加新产品时,由于工厂接口已经确定了创建产品的集合,这就不得不修改工厂创建类的接口,那么设计到的抽象工厂类以及子类都需要修改,违反了开闭原则。

    适用场景:

    1.不需要关注具体的产品实例如何被创建

    2.产品有多个系列,而我们只消费其中的一个系列

    3.要求提供一个产品的类型约束,所有的产品都要遵从该约束前提下才被创建时

    关于抽象工厂模式的学习就到此结束了,希望能够帮到你,若有不足,欢迎斧正,感谢您的阅读。

    参考:http://www.cnblogs.com/zhili/p/SimpleFactory.html

  • 相关阅读:
    查询linux服务器有哪些IP在连接
    GitLab的使用
    jenkins安装
    GitLab安装
    Git for Linux
    PV并发UV
    yum安装zabbix故障报错
    redis备份恢复
    python递归-三元表达式-列表生成式-字典生成式-匿名函数-部分内置函数-04
    python函数闭包-装饰器-03
  • 原文地址:https://www.cnblogs.com/jdzhang/p/6930347.html
Copyright © 2020-2023  润新知