抽象工厂模式
2015-06-23 23:48
363 查看
什么是抽象工厂模式:
Provides an interface for creating families of related or dependent objects without specifying their concrete classes.
1.就是提供一个接口,这个接口的目的是创建对象。
2.创建什么样的对象?创建有族群关系的对象。
所谓的产品族群,是指位于不同产品等级结构中功能相关联的产品组成的家族
3.怎么创建?不通过制定具体的类型。
1.我们有一个抽象工厂接口:
AbstractFactory
所有的具体工厂都要通过实现这个接口来生产(创建)对象。
2.几个(两个)实现这个抽象工厂的具体工厂,工厂A、工厂B。
工厂A生成A系列的产品。
ConcreteFactoryA
工厂B生成B系列的产品。
ConcreteFactoryB
3.因为A、B不止单一的产品,他们各自有一族产品(产品A族,B族分别包括很多产品),所以这里有另个抽象的A、B产品定义。
AbstractProductA
AbstractProductB
4.客户端 只与 AbstractFactory、 AbstractProductB、AbstractProductA交互。并且客户端完全不知道实现类的存在,只在运行时决定获取哪个具体的工厂实现 去完成具体产品的创建。
也就是说,客户端完全与具体的实现解耦。另外一点,新的产品族也很灵活的被加入(易扩展)。怎么加入?通过去创建一个实现了抽象工厂的实现类(ConcreteFactoryC、ConcreteFactoryD…),并且相应的创建实现了抽象产品族(AbstractProductC、AbstractProductD…)的具体产品。
适用场景
当你要创建多个产品(对象)族或一系列的产品,但是不希望暴漏关于创建产品的实现细节。因为,客户端(调用者)与具体实现完全解耦。代码示例
//Our AbstractProduct public interface Window { public void setTitle(String text); public void repaint(); }
//ConcreteProductA1 public class MSWindow implements Window { public void setTitle() { //MS Windows specific behaviour }
public void repaint() { //MS Windows specific behaviour } }
//ConcreteProductA2 public class MacOSXWindow implements Window { public void setTitle() { //Mac OSX specific behaviour } public void repaint() { //Mac OSX specific behaviour } }
//AbstractFactory public interface AbstractWidgetFactory { public Window createWindow(); }
//ConcreteFactory1 public class MsWindowsWidgetFactory implements AbstractWidgetFactory { //create an MSWindow public Window createWindow() { MSWindow window = new MSWindow(); return window; } }
//ConcreteFactory2 public class MacOSXWidgetFactory implements AbstractWidgetFactory { //create a MacOSXWindow public Window createWindow() { MacOSXWindow window = new MacOSXWindow(); return window; } }
//Client public class GUIBuilder { public void buildWindow(AbstractWidgetFactory widgetFactory) { Window window = widgetFactory.createWindow(); window.setTitle("New Window"); } }
public class Main{ public static void main(String[] args) { GUIBuilder builder = new GUIBuilder(); AbstractWidgetFactory widgetFactory = null; //check what platform we're on if(Platform.currentPlatform()=="MACOSX") { widgetFactory = new MacOSXWidgetFactory(); } else { widgetFactory = new MsWindowsWidgetFactory(); } builder.buildWindow(widgetFactory); } }
于是,我们在客户端就通过抽象的产品接口,获取具体的产品。
有没有发现一个问题?抽象工厂其实是借助具体工厂的手来动态的获取具体产品。那具体工厂就和客户端耦合了,难道不应该动态获取么?为什么要实例化?
相关文章推荐
- ThinkPhp学习10
- Flash Attribute
- UITableViewController-简单自定义单元格
- [hihoCoder1014]Trie树[前缀树][前缀树的建立]
- LeetCode226:Invert Binary Tree
- ThinkPhp学习09
- ThinkPhp学习08
- ThinkPhp学习07
- lucene原理学习笔记(一)
- PHP爬虫(3)PHP DOM开源代码里的大坑和字符编码
- 学习笔记-基础知识8-集合框架(1)上
- C语言复杂声明,指令函数
- ARCH64:怎样恢复函数的栈
- ThinkPhp学习06
- 我的博客,我的梦想
- 路由器做DHCP的两个实验
- 大数据架构和模式(五):利用大数据识别保险行业中的欺诈业务案例
- CF 9C Hexadecimal's Numbers
- Hibernate性能调优--关联实体的延迟加载
- ThinkPhp学习05