Fork me on GitHub

【设计模式篇】工厂模式

描述

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

(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。
  • 可以转载该博客,但必须著名博客来源。

   

 

posted @ 2017-12-06 17:30  Alan_beijing  阅读(1025)  评论(0编辑  收藏  举报