标签:style blog class code java tar javascript width color string get
概述
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.让子类决定实例化哪一个类
角色
抽象工厂(Creator):这个抽象类(或接口)声明一个创建对象的工厂方法,用来返回一个Product类型的对象。
具体工厂(ConcreteCreator):重定义工厂方法,返回一个具体的Concrete Product实例。
抽象产品(Product):定义工厂方法所创建的对象
具体产品(ConcreteProduct): 具体产品,继承自Product抽象类。
解读
UML图
c#代码
1 /// <summary> 2 /// 产品抽象类 3 /// </summary> 4 public abstract class Product 5 { 6 public string Name 7 { 8 get; 9 set; 10 } 11 } 12 13 14 /// <summary> 15 /// 具体的产品类 16 /// </summary> 17 public class ConcreteProductA:Product 18 { 19 public ConcreteProductA () 20 { 21 Name = "A"; 22 } 23 } 24 25 public class ConcreteProductB : Product 26 { 27 public ConcreteProductB () 28 { 29 Name = "B"; 30 } 31 } 32 33 34 /// <summary> 35 /// 抽象工厂类 36 /// </summary> 37 public interface Creator 38 { 39 Product Create (); 40 } 41 42 ///具体工厂类,每一个类对应生成一个产品 43 public sealed class ProductACreator:Creator 44 { 45 public Product Create () 46 { 47 return new ConcreteProductA (); 48 } 49 } 50 51 public sealed class ProductBCreator : Creator 52 { 53 public Product Create () 54 { 55 return new ConcreteProductB (); 56 } 57 }
总结
优点:
工厂方法去除了条件分支(解除了工厂类与分支的耦合),解决了简单工厂对修改开放的问题<OCP>。
缺点:
工厂方法模式实现时,客户端需要决定实例化哪个工厂来实现对具体产品的构建,选择判断依然存在,也就是说,工厂方法模式将简单工厂的逻辑判断交给客户端去处理。
对简单工厂模式来说,增加功能是要修改工厂类的;但对工厂方法模式,修改的是客户端。
使用场景:
对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。
子类的数量不固定,随时可能有新的功能子类出现
随笔
具体工厂类需要随着具体类的增加而增加,且数量应该是一致的!
抽象工厂模式<Abstract Factory>,码迷,mamicode.com
标签:style blog class code java tar javascript width color string get
原文地址:http://www.cnblogs.com/hjqc/p/3701571.html