zoukankan      html  css  js  c++  java
  • C#设计模式(3)——抽象工厂模式

    出处:https://www.cnblogs.com/wyy1234/

    阅读目录


    1.抽象工厂模式介绍

      上一篇我们了解了工厂模式,知道工厂模式可以解决简单工厂的缺陷(简单工厂添加新产品时要修改工厂类,不符合开闭原则),但是简单工厂和工厂模式都是只生产一种产品(前边的简单工厂和工厂都只生产鼠标),实际上戴尔和惠普公司不仅生产鼠标还生产键盘,为了解决系列产品的问题,就有了抽象工厂模式。我们就以生产鼠标和键盘为例来理解抽象工厂。

    产品类,包括鼠标类和键盘类

    复制代码
       //鼠标抽象类
        public abstract class Mouse
        {
            public abstract void Print();
        }
    
       //戴尔鼠标
        public class DellMouse : Mouse
        {
            public override void Print()
            {
                Console.WriteLine("生产了一个Dell鼠标!");
            }
        }
    
        //惠普鼠标
        public class HpMouse : Mouse
        {
            public override void Print()
            {
                Console.WriteLine("生产了一个惠普鼠标!");
            }
        }
    
    
       //键盘抽象类
        public abstract class Keybo
        {
            public abstract void Print();
        }
    
        //戴尔键盘类
        public class DellKeybo : Keybo
        {
            public override void Print()
            {
                Console.WriteLine("生产了一个戴尔键盘!");
            }
        }
    
       //惠普键盘
        public class HpKeybo : Keybo
        {
            public override void Print()
            {
                Console.WriteLine("生产了一个惠普键盘!");
            }
        }
    复制代码

    工厂类, 抽象工厂类提供了生产鼠标和生产键盘的抽象方法,戴尔工厂继承了抽象工厂,实现抽象方法时只创建自己品牌的鼠标和键盘;惠普工厂同理,代码如下:

    复制代码
        /// <summary>
        /// Pc产品工厂抽象类
        /// </summary>
        public abstract class PcFactory
        {
            public abstract Mouse CreateMouse();
            public abstract Keybo CreateKeybo();
        }
    
        //戴尔pc工厂
        public class DellPcFactroy : PcFactory
        {
            public override Keybo CreateKeybo()
            {
                return new DellKeybo();
            }
    
            public override Mouse CreateMouse()
            {
                return new DellMouse();
            }
        }
    
        //惠普pc工厂
        public class HpPcFactory : PcFactory
        {
            public override Mouse CreateMouse()
            {
                return new HpMouse();
            }
            public override Keybo CreateKeybo()
            {
                return new HpKeybo();
            }
    
        }
    复制代码

    客户端代码:

    复制代码
       class Program
        {
            static void Main(string[] args)
            {
                //生产一个戴尔鼠标/键盘
                PcFactory dellFactory = new DellPcFactroy();
                Mouse dellMouse= dellFactory.CreateMouse();
                Keybo dellKeybo = dellFactory.CreateKeybo();
                dellMouse.Print();
                dellKeybo.Print();
    
                //生产一个惠普鼠标/键盘
                PcFactory hpFactory = new HpPcFactory();
                Mouse hpMouse = hpFactory.CreateMouse();
                Keybo hpKeybo = hpFactory.CreateKeybo();
                hpMouse.Print();
                hpKeybo.Print();
                Console.ReadKey();
            }
        }
    复制代码

    程序运行结果如下:

    我们可以看出抽象工厂和工厂模式的区别在于:抽象工厂可以生产多种产品(两种:鼠标和键盘),而工厂模式只生产一种产品(键盘),抽象工厂主要时解决生产系列产品的问题。思考一下:如果抽象工厂中只有一种产品是什么情况呢?只有一种产品的抽象工厂其实就是工厂模式,我们可以把工厂模式看作是抽象工厂的一个特例。

    2.小结

    上边例子的类图:

     抽象工厂的优点:抽象工厂具有工厂模式的优点,对添加系列产品符合闭合原则(工厂模式的系列产品只有一种)。如要生产华硕的鼠标和键盘,只需要添加一个AsusPcFactory(继承与PcFactory),AsusMouse(继承Mouse),AsusKeybo(继承Keybo),就可以在客户端通过以下代码生产华硕鼠标和键盘:

    PcFactory asusPcFactory=new AsusPcFactory();
    asusPcFactory.CreateMouse();//生产华硕鼠标
    asusPcFactory.CreaetKeybo();//生产华硕键盘

    抽象模式的缺点:抽象模式对添加新产品不符合开闭原则。如要生产显示器,不仅要添加显示器抽象类和显示器具体类,还需要修改PcFactory,在抽象工厂中添加一个CreateDisplay抽象方法(或接口),戴尔工厂和惠普工厂也要实现新增的抽象方法(或者接口)。

  • 相关阅读:
    github添加版本号
    centOS 7联网
    运用session来控制用户的异地登录被挤下线情况
    寻找节点d=n的节点算法
    基于Seajs的可控台球碰撞游戏
    RequireJs 源码解读及思考
    BackBone 源码解读及思考
    关于「远程兼职」
    cocos2d-html5 中的性能优化
    细说移动前端Android联调
  • 原文地址:https://www.cnblogs.com/frank0812/p/11241926.html
Copyright © 2011-2022 走看看