• 抽象工厂模式


      前两篇博文主要是针对我们出行开什么车,怎么选车这样的问题所做的设计,针对的是同一个具体产品族:MyCar。

    而我们接下来说的抽象工厂模式是针对不同的多种产品族而言的,工厂方法模式对应的是一个工厂内的一个产品线,只负责生产

    一种产品:MyCar,而抽象工厂模式对应的则是整个工厂,负责多种产品线以及生产什么的控制。

    抽象工厂模式Demo类图:

      

    例子可能不能那么形象的比喻,不过原理是如此的,根据不同的应用场景转换。我们就改为城堡吧,我们的大仓库停放着各种交通工具,其中有

    汽车、飞机、机车等等。有的时候我们的出行单纯的汽车并不能满足,这时候就需要其他的交通工具如飞机。当我们出海旅游时,驾驶汽车到

    海边,然后驾驶水上飞机低空飞行。

    产品1类(MyCar):

     1     public abstract class MyCar
     2     {
     3         public abstract string Color { get; }
     4         public abstract void Driving();
     5     }
     6 
     7     /// <summary>
     8     /// 商务车
     9     /// </summary>
    10     public class BusinessCar : MyCar
    11     {
    12         public override string Color
    13         {
    14             get
    15             {
    16                 return "Black";
    17             }
    18         }
    19 
    20         public override void Driving()
    21         {
    22             Console.WriteLine("驾驶商务车");
    23         }
    24     }
    25 
    26     /// <summary>
    27     /// 越野车
    28     /// </summary>
    29     public class OffroadCar : MyCar
    30     {
    31         public override string Color
    32         {
    33             get
    34             {
    35                 return "White";
    36             }
    37         }
    38 
    39         public override void Driving()
    40         {
    41             Console.WriteLine("驾驶越野车");
    42         }
    43     }
    44 
    45     /// <summary>
    46     /// 跑车
    47     /// </summary>
    48     public class SportCar : MyCar
    49     {
    50         public override string Color
    51         {
    52             get
    53             {
    54                 return "Red";
    55             }
    56         }
    57 
    58         public override void Driving()
    59         {
    60             Console.WriteLine("驾驶跑车");
    61         }
    62     }
    View Code

    产品2类(MyPlane):

     1 public abstract class MyPlane
     2     {
     3         public abstract int Speed { get; }
     4         public abstract void Flying();
     5     }
     6 
     7     public class Helicopter : MyPlane
     8     {
     9         public override int Speed
    10         {
    11             get
    12             {
    13                 return 350;
    14             }
    15         }
    16 
    17         public override void Flying()
    18         {
    19             Console.WriteLine("直升机飞行中");
    20         }
    21     }
    22 
    23     public class Jet : MyPlane
    24     {
    25         public override int Speed
    26         {
    27             get
    28             {
    29                 return 880;
    30             }
    31         }
    32 
    33         public override void Flying()
    34         {
    35             Console.WriteLine("客机飞行中");
    36         }
    37     }
    38 
    39     public class Seaplane : MyPlane
    40     {
    41         public override int Speed
    42         {
    43             get
    44             {
    45                 return 220;
    46             }
    47         }
    48 
    49         public override void Flying()
    50         {
    51             Console.WriteLine("水上飞机飞行中");
    52         }
    53     }
    View Code

    工厂类:

     1 /// <summary>
     2     /// 抽象工厂
     3     /// </summary>
     4     public abstract class Factory
     5     {
     6         public abstract MyCar SelectCar();
     7 
     8         public abstract MyPlane SelectPlane();
     9     }
    10 
    11 
    12     public class BusinessFactory : Factory
    13     {
    14         public override MyCar SelectCar()
    15         {
    16             return new BusinessCar();
    17         }
    18 
    19         public override MyPlane SelectPlane()
    20         {
    21             return new Jet();
    22         }
    23     }
    24 
    25 
    26     public class SportFactory : Factory
    27     {
    28         public override MyCar SelectCar()
    29         {
    30             return new SportCar();
    31         }
    32 
    33         public override MyPlane SelectPlane()
    34         {
    35             return new Seaplane();
    36         }
    37     }
    38 
    39     public class OffroadFactory : Factory
    40     {
    41         public override MyCar SelectCar()
    42         {
    43             return new OffroadCar();
    44         }
    45 
    46         public override MyPlane SelectPlane()
    47         {
    48             return new Helicopter();
    49         }
    50     }
    View Code

    客户端:

     1 static void Main(string[] args)
     2         {
     3             //去海边玩喽
     4             Factory factory = new SportFactory();
     5             MyCar myCar= factory.SelectCar();
     6             MyPlane myPlane = factory.SelectPlane();
     7             myCar.Driving();
     8             Thread.Sleep(1000);
     9             myPlane.Flying();
    10             Console.ReadLine();
    11         }
    View Code

    运行结果:

    抽象工厂模式和工厂方法模式有些容易混淆,不过适用的场景还是存在一定的区别:工厂模式专注于单一产品(对象)

    的生产过程,而抽象工厂模式更关注的是可以生产多种产品系列。

    在我们的项目开发种最常见的就是关于项目数据库的适配操作,项目需要针对不同的数据库类型提供不同的访问数据库的

    对象,这时候就会才用抽象工厂模式,但也不是单纯的抽象工厂模式,一般是简单工厂+抽象工厂模式+反射+配置文件

    的搭配,后面的会在博文中进行详细的介绍。

  • 相关阅读:
    Redis中统计各种数据大小的方法
    Redis配置文件详解
    Redis服务器的启动过程分析
    在Mac OS上安装Vagrant和Docker的教程
    使用Redis实现用户积分排行榜的教程
    Redis教程(一):Redis简介
    Redis教程(二):String数据类型
    Redis教程(四):Hashes数据类型
    Redis教程(六):Sorted-Sets数据类型
    Redis教程(八):事务详解
  • 原文地址:https://www.cnblogs.com/ultimateWorld/p/5696281.html
Copyright © 2020-2023  润新知