抽象工厂模式(笔记)
2014-02-08 17:33
260 查看
定义:
抽象工厂模式是所有形态的工厂模式最为抽象和最为一般性的模式。抽象工厂模式可以向客户端提供一个接口,使得客户端不必在指定产品的具体类型的前提下,能够创建多个产品族的产品对象。
抽象工厂中方法对于产品结构,具体工厂对应于产品族
主要角色及UML
抽象产品:AbstractProduct
都有可能具体不同的实现
具体产品:ConcreteProduct 具体产品
对应于抽象产品的具体实现
抽象接口工厂:AbstractFactory
包含所有创建产品的抽象方法
具体接口工厂:ConcreteFactory 创建特定实现的产品对象
源代码:
客户端测试类:
结果:
具体产品A1
具体产品B1
具体产品A2
具体产品B2
抽象工厂模式的优缺点分析:
优点:客户端不再负责对象的具体创建,而是把这个责任交给了具体的工厂类,客户端只负责对对象的调用。当具有产品家族性质的产品被涉及到一个工厂类中后,对客户端而言是非常友好的,更重要的是如果想要更换为另外一产品家族,所要做的只是需要增加相应的产品家族成员和增加一个具体的产品工厂而已。
缺点:当有新的产品加入的时候,也就是当产品的结构发生改变时,修要修改抽象工厂类的设计,这就导致了必须修改所有的具体工厂类,导致很客观的工作量的增加。
抽象工厂模式是所有形态的工厂模式最为抽象和最为一般性的模式。抽象工厂模式可以向客户端提供一个接口,使得客户端不必在指定产品的具体类型的前提下,能够创建多个产品族的产品对象。
抽象工厂中方法对于产品结构,具体工厂对应于产品族
主要角色及UML
抽象产品:AbstractProduct
都有可能具体不同的实现
具体产品:ConcreteProduct 具体产品
对应于抽象产品的具体实现
抽象接口工厂:AbstractFactory
包含所有创建产品的抽象方法
具体接口工厂:ConcreteFactory 创建特定实现的产品对象
源代码:
// 抽象产品A角色 package com.pattern.abstractfactory; public interface AbstractProductA{ public void say(); }
// 抽象产品B角色 package com.pattern.abstractfactory; public interface AbstractProductB{ public void say(); }
// 具体产品A1角色 package com.pattern.abstractfactory; public class ConcreateProductA1 implements AbstactProdctA{ public void say(){ System.out.println("具体产品A1"); } }
// 具体产品A2角色 package com.pattern.abstractfactory; public class ConcreateProductA2 implements AbstactProdctA{ public void say(){ System.out.println("具体产品A2"); } }
// 具体产品B1角色 package com.pattern.abstractfactory; public class ConcreateProductB1 implements AbstactProdctA{ public void say(){ System.out.println("具体产品B1"); } }
// 具体产品B2角色 package com.pattern.abstractfactory; public class ConcreateProductB2 implements AbstactProdctA{ public void say(){ System.out.println("具体产品B2"); } }
// 抽象工厂角色 package com.pattern.abstractfactory; public interface AbstarctFactory{ public AbstractProductA createProductA(); public AbstractProductB createProductB(); }
// 具体工厂角色A package com.pattern.abstractfactory; public class ConcreateFactoryA implements AbstarctFactory{ pulic AbstractProductA createProductA(){ return new ConcreateProductA1(); } public AbstactProductB createProductB(){ return new ConcreateProductB1(); } }
// 具体工厂角色B package com.pattern.abstractfactory; public class ConcreateFactoryB implements AbstarctFactory{ pulic AbstractProductA createProductA(){ return new ConcreateProductA2(); } public AbstactProductB createProductB(){ return new ConcreateProductB2(); } }
客户端测试类:
// 测试类 package com.pattern.abstractfactory; public static void main(String []args){ AbstactFactory fa = new ConcreateFactoryA(); AbstractProductA pa = fa.createProductA(); AbstractProductB pb = fa.createProductB(); AbstactFactory fb = new ConcreateFactoryB(); AbstractProductA pa1 = fb.createProductA(); AbstractProductB pb1 = fb.createProductB(); pa.say(); pb.say(); pa1.say(); pb1.say(); }
结果:
具体产品A1
具体产品B1
具体产品A2
具体产品B2
抽象工厂模式的优缺点分析:
优点:客户端不再负责对象的具体创建,而是把这个责任交给了具体的工厂类,客户端只负责对对象的调用。当具有产品家族性质的产品被涉及到一个工厂类中后,对客户端而言是非常友好的,更重要的是如果想要更换为另外一产品家族,所要做的只是需要增加相应的产品家族成员和增加一个具体的产品工厂而已。
缺点:当有新的产品加入的时候,也就是当产品的结构发生改变时,修要修改抽象工厂类的设计,这就导致了必须修改所有的具体工厂类,导致很客观的工作量的增加。
相关文章推荐
- 设计模式笔记-抽象工厂模式
- Java设计模式笔记之抽象工厂模式
- 【设计模式学习笔记】 之 抽象工厂模式
- 设计模式学习笔记——抽象工厂模式
- 《Head first设计模式》学习笔记 – 抽象工厂模式
- 设计模式学习笔记-抽象工厂模式
- 笔记:设计模式(3)-Abstract Factory抽象工厂模式
- 《Head first设计模式》学习笔记 - 抽象工厂模式
- Java学习笔记---设计模式之抽象工厂模式
- 设计模式学习笔记(五)—Abstract Factory抽象工厂模式
- 十一、抽象工厂模式——设计模式学习笔记
- [设计模式整理笔记 四] 抽象工厂模式(Abstract Factory)
- 设计模式C++学习笔记之七(AbstractFactory抽象工厂模式)
- 四 抽象工厂模式——设计模式学习笔记
- 2.工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)(设计模式笔记)
- 设计模式学习笔记(3) - 抽象工厂模式
- 设计模式学习笔记--抽象工厂模式
- C++学习笔记(二十八)工厂模式、简单工厂模式与抽象工厂模式
- 设计模式(c++)笔记之二(AbstractFactory抽象工厂模式)