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();
         }
       }

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

  • 相关阅读:
    快学scala习题解答--第五章 类
    从头认识java-18.2 主要的线程机制(2)-Executors的使用
    关于Bootstrap的理解
    Raw-OS源代码分析之idle任务
    Scilab 的画图函数(3)
    HDU2586.How far away ?——近期公共祖先(离线Tarjan)
    Codeforces Round #311 (Div. 2) A,B,C,D,E
    presto访问 Azure blob storage
    Presto集群安装配置
    Presto架构及原理
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1809556.html
Copyright © 2011-2022 走看看