C#设计模式——(创建型-抽象工厂设计模式)

2022-10-08 16:15:10 浏览数 (1)

一、应用场景

分别用简单工厂设计模式和工厂方法设计模式实现:创建不同品牌的键盘。

代码语言:javascript复制
 #region  简单工厂
        public interface IKeyBoard
        {
            void ShowBrand();
        }
        public class DellKeyBoard : IKeyBoard
        {
            public void ShowBrand()
            {
                Console.WriteLine("我是戴尔键盘"); ;
            }
        }
        public class LenovoKeyBoard : IKeyBoard
        {
            public void ShowBrand()
            {
                Console.WriteLine("我是联想键盘");
            }
        }
        public class HPKeyBoard : IKeyBoard
        {
            public void ShowBrand()
            {
                Console.WriteLine("我是惠普键盘");
            }
        }
        public class KeyBoardFactory
        {
            public static IKeyBoard GetKeyBoard(string brand)
            {
                IKeyBoard kb = null;
                switch (brand)
                {
                    case "Dell":
                        kb = new DellKeyBoard();
                        break;
                    case "Lenovo":
                        kb = new LenovoKeyBoard();
                        break;
                    case "HP":
                        kb = new HPKeyBoard();
                        break;
                    default:
                        break;
                }
                return kb;
            }
        }
         #endregion
代码语言:javascript复制
        #region 工厂方法
        public interface IKeyBoardFactory
        {
            IKeyBoard GetKeyBoard();
        }
        public class DellBoardFactory : IKeyBoardFactory
        {
            public IKeyBoard GetKeyBoard()
            {
                return new DellKeyBoard();
            }
        }
        public class LenovoBoardFactory : IKeyBoardFactory
        {
            public IKeyBoard GetKeyBoard()
            {
                return new LenovoKeyBoard();
            }
        }
        public class HPBoardFactory : IKeyBoardFactory
        {
            public IKeyBoard GetKeyBoard()
            {
                return new HPKeyBoard();
            }
        }
        #endregion

二、定义

为了减少创建子类工厂的数量,不必给每一个产品分配一个工厂类,可以将产品进行分组,每组中的不同产品由同一个工厂类的不同方法进行创建。

抽象工厂代码如下:

代码语言:javascript复制
        #region 抽象工厂
        //如果要添加鼠标、显示屏等产品
        public interface IMouse
        {
            void ShowMouseBrand();
        }
        public class DellMouse : IMouse
        {
            public void ShowMouseBrand()
            {
                Console.WriteLine("戴尔鼠标"); ;
            }
        }
        public class HPMouse : IMouse
        {
            public void ShowMouseBrand()
            {
                Console.WriteLine("惠普鼠标"); ;
            }
        }
        public interface AbstractFactory
        {
            IKeyBoard GetKeyBoard();
            IMouse GetMouse();
        }
        public class DellFactory : AbstractFactory
        {
            public IKeyBoard GetKeyBoard()
            {
                return new DellKeyBoard();
            }

            public IMouse GetMouse()
            {
                return new DellMouse();
            }
        }
        public class HPFactory : AbstractFactory
        {
            public IKeyBoard GetKeyBoard()
            {
               return new  HPKeyBoard();
            }

            public IMouse GetMouse()
            {
                return new HPMouse();
            }
        }
        #endregion

三、三种模式的对比

  • 简单工厂:只有一个工厂类,一个产品抽象类,工厂类创建方法依据传入参数并判断选择创建具体的产品对象;
  • 工厂方法:有多个工厂类,一个产品抽象类,一个工厂抽象类,利用多态创建不同的产品对象,避免大量的switch case,实现了细节依赖抽象
  • 抽象工厂:多个工厂类,多个产品抽象类,产品子类分组,同一个工厂实现类创建同组中的不同产品对象,减少了工厂子类的数量。

0 人点赞