设计模式之抽象工厂模式

本文介绍了抽象工厂模式的概念、应用场景及其实现方式,并通过C#代码示例详细展示了如何创建形状和颜色的不同产品族,最后总结了该模式的优点和缺点。

一、概念

  • 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂;
    个人理解抽象工厂就是来管理工厂的;

二、场景

  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
  • 这个系统有多于一个的产品族,而系统只消费其中某一产品族。
    同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
  • 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。

三、实现

  • 新建正方形类,类名: Square 继承 IShape
       using System;
      
      namespace 抽象工厂
      {
          class Square:IShape
          {
            public  void GetShape()
            { 
               System.Console.WriteLine("这是正方形");
            }
          }
      }
     
    
  • 新建矩形类,类名:Rectangle 继承 IShape
     using System;
    
      namespace 抽象工厂
      {
          class Rectangle:IShape
          {
            public  void GetShape()
             {
              System.Console.WriteLine("这是矩形");
             }
          }
      }  
    
  • 新建圆形类,类名:Round 继承 IShape
          using System;
          
          namespace 抽象工厂
          {
              class Round:IShape
              {
                 public  void GetShape()
                 {
                  System.Console.WriteLine("这是圆形");
                 }
              }
          }    
    
  • 新建形状接口类,类名:IShape
      using System;
      
      namespace 抽象工厂
      {
          interface IShape
          {
              void GetShape();
          }
      }    
    
  • 新建形状工厂类,类名:ShapeFactory 继承 FactoryAbstract
      using System;
      
      namespace 抽象工厂
      {
          class ShapeFactory:FactoryAbstract
          {
            public override  IShape GetShapeObject(string flage){
              switch (flage)
                  {
                    case "Rectangle":
                      return  new Rectangle();
                    case "Round":
                      return new  Round();
                    case "Square":
                      return new Square();
                  } 
                  return null;
            } 
          }
      }    
    
  • 新建红色类,类名:Red 继承 IColor
      using System;
      
      namespace 抽象工厂
      {
          class Red:IColor
          {
             public  void Fill()
             {
              System.Console.WriteLine("这是红色");
             }
          }
      }
      
    
  • 新建蓝色类,类名:Blue 继承 IColor
      using System;
      
      namespace 抽象工厂
      {
          class Blue:IColor
          {
             public  void Fill()
             {
              System.Console.WriteLine("这是蓝色");
             }
          }
      }
      
    
  • 新建颜色接口类,类名:IColor
          using System;
          
          namespace 抽象工厂
          {
              interface IColor
              {
                  void Fill();
              }
          }    
    
  • 新建颜色工厂类,类名:ColorFactory 继承 FactoryAbstract
          using System;
          
          namespace 抽象工厂
          {
              class ColorFactory:FactoryAbstract
              {
                
               public override  IColor GetColorObject(string flage){
                  switch (flage)
                      {
                        case "Red":
                            return  new Red();
                        case "Blue":
                          return new Blue(); 
                      } 
                      return null;
                }  
              }
          }
      
    
  • 抽象工厂类,类名:FactoryAbstract
      using System;
      
      namespace 抽象工厂
      {
         abstract  class FactoryAbstract
          {
                public virtual   IColor GetColorObject(string flage){return null;}
                public virtual   IShape GetShapeObject(string flage){return null;}
          }
      }
      
    
  • 启动类
      using System;
      
      namespace 抽象工厂
      {
          class Program
          {
              static void Main(string[] args)
              {
                   FactoryAbstract fa = new ShapeFactory(); 
                   fa.GetShapeObject("Square").GetShape();
      
                   FactoryAbstract fa1 = new ShapeFactory(); 
                   fa1.GetShapeObject("Round").GetShape();
      
                   FactoryAbstract fa2 = new ShapeFactory(); 
                   fa2.GetShapeObject("Rectangle").GetShape();
      
                   FactoryAbstract fa3 = new ColorFactory(); 
                   fa3.GetColorObject("Red").Fill();
      
                   FactoryAbstract fa5 = new ColorFactory(); 
                   fa5.GetColorObject("Blue").Fill();
              }
          }
      }
      
    

四、优缺点

  • 优点
    • 分离了具体的类。客户通过抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。
    • 易于交换产品系列。一个具体工厂类只在初始化时出现一次,这使得改变一个应用的具体工厂变得很容易,只需改变具体的工厂即可使用不同的产品配置。
    • 有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。
  • 缺点
    • 难以支持新种类的产品。因为抽象工厂接口确定了可以被创建的产品集合,所以难以扩展抽象工厂以生产新种类的产品。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值