zoukankan      html  css  js  c++  java
  • 【设计模式篇】工厂模式

    描述

    本篇文章将将要分析设计模式中的工厂模式,具体包括如下内容:

    (1)什么是工厂模式?

    (2)工场模式的分类

    (3)工场模式代码分析

    1   理论区

    1.1   什么是工厂模式

    工厂模式属于对象创建型模式,其主要目的是解决软件架构间的耦合度问题,满足OO设计OCP原则。其关键技术是采用接口满足OCP原则,服务延迟等。

    1.2  工厂模式的分类

    简单工厂:产品级别的松耦合,但工厂违背OCP原则;

    工厂方法:工厂方法解决的是产品等级结构单一产品问题;

    抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体的类。抽象工厂解决的是一系列产品,即产品等级结构上的系列产品或多种产品等级结构系列产品的组合;

    1.3  简单工厂、工厂方法和抽象工厂之间联系

    共同点:产品级别Product一致;

    不同点:工厂级别Factory条件不一样,简单工厂工厂级别违背OCP原则,;工厂方法级别满足OCP原则,但不满足多种关联产品多种组合;抽象工厂满足多种关联产品多种组合;

    三者间转换:

     

    2  抽象工厂

     2.1  何为抽象工厂

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体的类。在设计模式中,属于对象创建型模式。

     2.2  实用性

    在以下情况,可以考虑使用Abstract Factory模式

    (1)一个系统要独立于它的产品的创建、组合和表示时

    (2)一个系统要由多个产品系列中的一个来配置时

    (3)当你要强调一系列相关的产品对象的设计以便进行联合使用时

    (4)当你提供一个产品类库,而只想显示他们的接口而不是实现时

    2.3  结构

    2.4  分析

    2.1—2.3为引用《设计模式:可复用面向对象软件的基础》中的内容,但似乎有些抽象,我们来将抽象的内容具体解剖一下。

    (1)工厂模式的本质:解决软件架构方面的耦合问题,满足OO软件设计的OCP原则,即开闭原则(Open Close Principle,简称OCP),对修改关闭,对扩展开放(一般解决思路:接口)。

    (2)2.1-2.3中,2.1-2.2均提到“一系列”关键词,在2.3的UML中,可以看出不止单个产品,也是“一系列”产品。不难看出,抽象工厂主要解决的是一系列产品(工厂方法解决的是单个产品,而抽象工厂解决的是一系列产品),为了充分理解“一系列”关键词,我们引入两个概念,即“产品族”和“产品等级结构”概念。

    产品族和产品等级结构:

      a.产品等级结构:由不同产品类型构成的系列,侧重在不同类产品组合;

      b.产品族: 由同类产品构成的不同规格系列,侧重在同类产品不同规格组合;

    我们举两个例子来说明:

    例一:家电行业

    我们都知道,海尔和TCL都生成冰箱和电视机,TCL电视机和电冰箱构成一个产品族,TCL和海尔电视机构成一个产品等级结构

    例二:水果行业

    南方苹果与梨,北方苹果与梨,南方苹果和梨构成一个产品族,南方和北方苹果,构成一个产品等级结构

    (3)其他一些理解归纳 (引用)

    a.抽象工厂模式比工厂方法更抽象。。。

    抽象工厂模式是把工厂方法再封装了一层。

    b.本来一个工厂里可以造汽车,空调,冰箱。

    现在工厂独立了,一个工厂造汽车,另一个工厂造空调,再另外一个工厂造冰箱。

    c.工厂一般造一种产品

    抽象工厂造许多种产品

    d.工厂是一种抽象,将创建对象的过程抽象;而抽象工厂更进一层,把工厂本身都抽象了。

    e.工厂是下订单的时候知道哪一家工厂。

    而抽象工厂是下订单的时候还不知道哪一家。

    f.工厂创建一种产品,抽象工厂创建的是一组产品,是一个产品系列。

    这里要注意的是“系列”的意思,也就是说,抽象工厂创建出的一组产品是成套的。

    当你发现,有一个接口可以有多种实现的时候,可以考虑使用工厂方法来创建实例。

    当你返现,有一组接口可以有多种实现方案的时候,可以考虑使用抽象工厂创建实例组。(这个讲的挺好的。)

    3  代码分析区

    3.1  简单工厂

    接口Product

    1  //产品接口
    2     public interface Product
    3     {
    4         //;
    5     }

    牙膏

    1  //产品牙膏
    2     public class ToothPaste : Product
    3     {
    4         public  ToothPaste()
    5         {
    6            Console.WriteLine("ToothPaste");
    7         }
    8        
    9     }

    牙刷

    1 //产品牙刷
    2     public class ToothBrush : Product
    3     {
    4         public ToothBrush()
    5         {
    6             Console.WriteLine("ToothBrush");
    7         }
    8     }

    简单工厂

     1 public class SimpleFactory
     2     {
     3         public Product CreateProduct(string ProductName)
     4         {
     5             if (ProductName == "牙刷")
     6             {
     7                 return new ToothBrush();
     8             }
     9             if (ProductName == "牙膏")
    10             {
    11                 return new ToothPaste();
    12             }
    13             else
    14             {
    15                 return null; 
    16             }
    17         }
    18     }

    Main方法

     1  class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             SimpleFactory simpleFactory = new SimpleFactory();
     6             simpleFactory.CreateProduct("牙膏");
     7             simpleFactory.CreateProduct("牙刷");
     8             Console.Read();
     9         }
    10     }

    测试结果

    3.2  工厂方法

    测试方法

     1  class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5             IFactoryMethod ifactoryMethod;
     6             ifactoryMethod = new FactoryMethod_ToothPaste();
     7             ifactoryMethod.CreateProduct();
     8             ifactoryMethod = new FactoryMethod_ToothBrush();
     9             ifactoryMethod.CreateProduct();
    10             ifactoryMethod = new FactoryMethod_ToothMug();
    11             ifactoryMethod.CreateProduct();
    12 
    13             Console.Read();
    14         }
    15     }

    工厂类接口

    1  //工厂类接口
    2     public interface IFactoryMethod
    3     {
    4         Product CreateProduct();
    5     }

    工厂产生产品

     1 //产生牙膏的工厂
     2     public class FactoryMethod_ToothPaste : IFactoryMethod
     3     {
     4         public Product CreateProduct()
     5         {
     6             return new Product_ToothPaste();
     7         }
     8     }
     9     //产生牙刷的工厂
    10     public class FactoryMethod_ToothBrush : IFactoryMethod
    11     {
    12         public Product CreateProduct()
    13         {
    14             return new Product_ToothBrush();
    15         }
    16     }
    17     //产生牙缸的工厂
    18     public class FactoryMethod_ToothMug : IFactoryMethod
    19     {
    20         public Product CreateProduct()
    21         {
    22             return new Product_ToothMug();
    23         }
    24     }

    产品接口

    1 //产品接口
    2     public interface Product
    3     {
    4         //;
    5     }

    产品

     1  //产品牙膏
     2     public class Product_ToothPaste : Product
     3     {
     4         public Product_ToothPaste()
     5         {
     6            Console.WriteLine("ToothPaste");
     7         }
     8        
     9     }
    10     //产品牙刷
    11     public class Product_ToothBrush : Product
    12     {
    13         public Product_ToothBrush()
    14         {
    15             Console.WriteLine("ToothBrush");
    16         }
    17     }
    18     //产品牙缸
    19     public class Product_ToothMug : Product
    20     {
    21         public Product_ToothMug()
    22         {
    23             Console.WriteLine("ToothMug");
    24         }
    25     }

    测试结果:

    3.3  抽象工厂

    测试方法

     1  //测试方法
     2     class Program
     3     {
     4         static void Main(string[] args)
     5         {
     6             IFactoryMethod ifactoryMethod;
     7             ifactoryMethod = new FactoryMethod_ToothPaste();
     8             ifactoryMethod.CreateProduct();
     9             ifactoryMethod.CreateGift();
    10             ifactoryMethod = new FactoryMethod_ToothBrush();
    11             ifactoryMethod.CreateProduct();
    12             ifactoryMethod.CreateGift();
    13             ifactoryMethod = new FactoryMethod_ToothMug();
    14             ifactoryMethod.CreateProduct();
    15             ifactoryMethod.CreateGift();
    16 
    17             Console.Read();
    18         }
    19     }

    测试结果

    赠送物品接口

    1  //赠送物品接口
    2     public interface Gift
    3     {
    4         //
    5     }

    赠送物品

     1 //牙膏赠送物品
     2     public class Product_ToothPaste_Gift : Gift
     3     {
     4         public Product_ToothPaste_Gift()
     5         {
     6             Console.WriteLine("Gift:Red Towel");
     7         }
     8            
     9     }
    10     //牙刷赠送物品
    11     public class Product_ToothBrush_Gift : Gift
    12     {
    13         public Product_ToothBrush_Gift()
    14         {
    15             Console.WriteLine("Gift:Yellow Towel");
    16         }
    17 
    18     }
    19     //牙缸赠送物品
    20     public class Product_ToothMug_Gift : Gift
    21     {
    22         public Product_ToothMug_Gift()
    23         {
    24             Console.WriteLine("Gift:Pink Towel");
    25         }
    26 
    27     }

    工厂类接口

    1 //工厂类接口
    2     public interface IFactoryMethod
    3     {
    4         Product CreateProduct();
    5         Gift CreateGift();
    6     }

    工厂产生产品

    //产生牙膏的工厂
        public class FactoryMethod_ToothPaste : IFactoryMethod
        {
            public Gift CreateGift()
            {
                return new Product_ToothPaste_Gift();
            }
    
            public Product CreateProduct()
            {
                return new Product_ToothPaste();
            }
        }
        //产生牙刷的工厂
        public class FactoryMethod_ToothBrush : IFactoryMethod
        {
            public Gift CreateGift()
            {
                return new Product_ToothPaste_Gift();
            }
    
            public Product CreateProduct()
            {
                return new Product_ToothBrush();
            }
        }
        //产生牙缸的工厂
        public class FactoryMethod_ToothMug : IFactoryMethod
        {
            public Gift CreateGift()
            {
                return new Product_ToothMug_Gift();
            }
    
            public Product CreateProduct()
            {
                return new Product_ToothMug();
            }
        }

    产品接口

    1 //产品接口
    2     public interface Product
    3     {
    4         //;
    5     }

    产品

      //产品牙膏
        public class Product_ToothPaste : Product
        {
            public Product_ToothPaste()
            {
               Console.WriteLine("ToothPaste");
            }
           
        }
        //产品牙刷
        public class Product_ToothBrush : Product
        {
            public Product_ToothBrush()
            {
                Console.WriteLine("ToothBrush");
            }
        }
        //产品牙缸
        public class Product_ToothMug : Product
        {
            public Product_ToothMug()
            {
                Console.WriteLine("ToothMug");
            }
        }

    4  参考文献

    【01】《Head First设计模式》

    【02】 《设计模式:可复用面向对象软件的基础》

    【03】http://m.blog.csdn.net/will130/article/details/50459177

    【04】http://m.92to.com/bangong/2017/01-16/16329359.html

    5  版权区

     

    • 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
    • 博主网址:http://www.cnblogs.com/wangjiming/。
    • 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
    • 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2016177728@qq.com。
    • 可以转载该博客,但必须著名博客来源。

       

  • 相关阅读:
    菜鸟合作伙伴日志接入规范之C#实现
    使用JS在textarea在光标处插入内容
    ASP.NET MVC API 接口验证
    CSS3 grayscale滤镜+SVG使图片变黑白实例页面
    .NET MVC 获取 当前请求的 控制器/视图/区域 的名字
    asp.net 后台获取flv视频地址进行播放【转】
    实现输出h264直播流的rtmp服务器 flash直播服务器【转】
    如何实现一个c/s模式的flv视频点播系统
    视频流服务器配置[windows平台][转]
    小计
  • 原文地址:https://www.cnblogs.com/wangjiming/p/7989931.html
Copyright © 2011-2022 走看看