zoukankan      html  css  js  c++  java
  • 抽象工厂

      提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

    image_2

    对于不同类产品提供一类工厂

    1.产品接口

    interface IBag {
       string Material { get; }
     }
     
     // Product 2
     interface IShoes {
       int Price { get; }
     }


    2.工厂

    这里采用了泛型,所以会更灵活些

    interface IFactory<Brand>
       where Brand : IBrand {
       IBag CreateBag();
       IShoes CreateShoes();
     }
     
     // Conctete Factories (both in the same one)
     class Factory<Brand> : IFactory<Brand>
       where Brand : IBrand, new() {
       public IBag CreateBag() {
         return new Bag<Brand>();
       }
     
       public IShoes CreateShoes() {
         return new Shoes<Brand>();
       }
     }


    3.IBrand

    不同类产品信息

    interface IBrand {
       int Price { get; }
       string Material { get; }
     }
     
     class Gucci : IBrand {
       public int Price { get { return 1000; } }
       public string Material { get { return "Crocodile skin"; } }
     }
     
     class Poochy : IBrand {
       public int Price { get { return new Gucci().Price / 3; } }
       public string Material { get { return "Plastic"; } }
     }
     
     class Groundcover : IBrand {
       public int Price { get { return 2000; } }
       public string Material { get { return "South african leather"; } }
     }

    4.对不同类产品创建不同工厂

    class Client<Brand>
         where Brand : IBrand, new() {
         public void ClientMain() { //IFactory<Brand> factory)
           IFactory<Brand> factory = new Factory<Brand>();
     
           IBag bag = factory.CreateBag();
           IShoes shoes = factory.CreateShoes();
     
           Console.WriteLine("I bought a Bag which is made from " + bag.Material);
           Console.WriteLine("I bought some shoes which cost " + shoes.Price);
           Console.ReadKey();
         }
       }
     
       static class Program {
         static void Main() {
           // Call Client twice
           new Client<Poochy>().ClientMain();
           new Client<Gucci>().ClientMain();
           new Client<Groundcover>().ClientMain();
         }
       }

    此模式应该来说非常重要,应用也比较广泛.结合反射功能效果会更好.

  • 相关阅读:
    L317 电子烟
    L316 波音737Max 危机
    2.19.3月 专业综合错题
    L314 单音节词读音规则(二)-元音字母发音规则
    L313 珊瑚裸鼠灭绝
    L312 难看懂的
    Pycharm写代码中文输入法不跟随
    Windows下Python多版本共存
    Python之批处理字符串(打开文件)
    Python Url请求代码
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1809556.html
Copyright © 2011-2022 走看看