【设计模式篇】工厂模式
描述
本篇文章将将要分析设计模式中的工厂模式,具体包括如下内容:
(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。
- 可以转载该博客,但必须著名博客来源。