zoukankan      html  css  js  c++  java
  • 《软件架构与设计模式》关于 抽象工厂模式 的一个小例子

    下面是题目的要求:

    根据上面的要求,我首先是画出了UML类图:

    接着,根据上面的UML类图写出源代码:

    1、抽象产品类

    该类定义了产品的共性,所有的具体产品都要实现这个类

     1  abstract class Burger
     2     {
     3         public abstract void EatBurger();
     4     }
     5 
     6 
     7  abstract class Chicken
     8     {
     9         public abstract void EatChicken();
    10     }
    11 
    12 
    13 abstract class Drink
    14     {
    15         public abstract void EatDrink();
    16     }

    2、具体产品类

    决定了产品在客户端中的具体行为

     1 class KFCBurger : Burger
     2     {
     3         public override void EatBurger()
     4         {
     5             Console.WriteLine("I am eating KFC Burger");
     6         }
     7     }
     8 
     9     class McDonaldBurger : Burger
    10     {
    11         public override void EatBurger()
    12         {
    13             Console.WriteLine("i am eating McDonald Burger");
    14         }
    15     }
    16 
    17 class KFCChicken : Chicken
    18     {
    19         public override void EatChicken()
    20         {
    21             Console.WriteLine("i am eating KFC Chicken");
    22         }
    23     }
    24 
    25     class McDonaldChicken : Chicken
    26     {
    27         public override void EatChicken()
    28         {
    29             Console.WriteLine("i am eating McDonlad Chicken");
    30         }
    31     }
    32 
    33 
    34 
    35  class KFCDrink : Drink
    36     {
    37         public override void EatDrink()
    38         {
    39             Console.WriteLine("i am eating KFC Drink");
    40         }
    41     }
    42 
    43     class McDonaldDrink : Drink
    44     {
    45         public override void EatDrink()
    46         {
    47             Console.WriteLine("i am eating McDonlad Drink");
    48         }
    49     }

    3、抽象工厂类

    定义了具体工厂必须实现的接口

    1 interface IFactory
    2     {
    3         Burger MakeBurger();
    4         Chicken MakeChicken();
    5         Drink MakeDrink();
    6     }

    4、具体工厂类

    实现了如何具体的创建产品类

     class KFCFactory : IFactory
        {
            public Burger MakeBurger()
            {
                return new KFCBurger();
            }
            public Chicken MakeChicken()
            {
                return new KFCChicken();
            }
            public Drink MakeDrink()
            {
                return new KFCDrink();
            }
        }
    
        class McDonaldFactory : IFactory
        {
            public Burger MakeBurger()
            {
                return new McDonaldBurger();
            }
            public Chicken MakeChicken()
            {
                return new McDonaldChicken();
            }
            public Drink MakeDrink()
            {
                return new McDonaldDrink();
            }
        }

    5、product 套餐类

    class Product
        {
            private Burger _burger;
            private Chicken _chicken;
            private Drink _drink;
    
            public Burger burger
            {
                get { return _burger; }
                set { _burger = value; }
            }
    
            public Chicken chicken
            {
                get { return _chicken; }
                set { _chicken = value; }
            }
            public Drink drink
            {
                get { return _drink; }
                set { _drink = value; }
            }
    
            public void eatbypeople()
            {
                _burger.EatBurger();
                _chicken.EatChicken();
                _drink.EatDrink();
    
                Console.WriteLine("实在是太好吃了!");
            }
    
    
        }

    6、客户端代码

     1             IFactory factory = null;
     2 
     3             Console.Write("请根据不同的 K/M ,来选择不同品牌的套餐");
     4             string Select = Console.ReadLine();
     5 
     6             switch (Select)
     7             {
     8                 case "K":
     9                     factory = new KFCFactory();
    10                     break;
    11                 case "M":
    12                     factory = new McDonaldFactory();
    13                     break;
    14             }
    15 
    16             Product product1 = new Product();
    17             product1.burger = factory.MakeBurger();
    18             product1.chicken = factory.MakeChicken();
    19             product1.drink = factory.MakeDrink();
    20             product1.eatbypeople();
    21 
    22             Console.ReadLine();

    下面是具体的效果图:

    从  简单工厂模式  到  工厂方法模式  再到现在的  抽象工厂模式

    在这个过程的学习中,也体会到了各自模式的优缺点及改进的构成。

    接下来谈一谈我自己的看法,欢迎大家指正。

    我觉得上面的模式都是建立在 多态 的基础上实现的,

    简单工厂模式以一个工厂类为核心来创建多个继承抽象产品类的具体产品类。但是工厂类的本身违背了开-闭原则

    工厂方法模式就是对于简单工厂模式存在的缺点进行改进,将工厂类进行了继承,形成了抽象工厂类和具体工厂类,那么这样就符合了开-闭原则

    而抽象工厂模式则是将工厂方法模式中具体工厂类中的工厂方法增多,变成了一组工厂方法。

  • 相关阅读:
    Vue内敛模板
    vue自定义组件添加原生事件监听
    vue 组件开发 props 验证
    Vue中子组件数据跟着父组件改变和父组件数据跟着子组件改变的方法
    jQuery中outerWidth()方法
    CSS3-transition
    行内元素(例如)设置float之后才能用width调整宽度
    leetcode LRU Cache python
    opcache effect
    leetcode Same Tree python
  • 原文地址:https://www.cnblogs.com/bldz/p/4949106.html
Copyright © 2011-2022 走看看