设计模式之抽象工厂模式
2016-06-27 17:26
316 查看
抽象工厂模式(Abstract Factory):为创建一组相关或者互相依赖的对象提供一个接口,而无需指定它们对应的具体类。
通用类图如下:
![](http://img1.51cto.com/attachment/201007/174906629.jpg)
例如,我们现在有两种产品A和B,而产品A和B分别都有两个厂商1和2进行生产,在这里我们把不同的厂商1、厂商2理解为牌子1和牌子2,那么厂商1就生产A1、B1,厂商2生产A2、B2。
此时,不同的厂商肯定要生产自己的产品(如A1、B1),每个厂商都有自己的一系列产品,这就与上面抽象工厂模式的描述类似了。
该例子的类图如下:
![](http://img1.51cto.com/attachment/201007/174928984.jpg)
具体代码实现如下:
运行结果:
其实,上例中本来可以不用到了两个抽象工厂,只剩一个也可,但是这样子与我们现实生活中不同厂商各自生产自己的产品有点不同,所以就将其分开为两个了,也就是将两个厂商完全地分离开。
由上面类图可以知道,一旦任何一个厂商开发出了产品C的话,那么这个厂商肯定需要扩展自己的工厂来投入到C产品的生产中,那么此时工厂1和工厂2就需要进行一定的改变了,这很明显不符合开闭原则。
何时使用工厂方法设计模式?
对象的创建如果需要代码复用却没有现成的代码可用时,工厂方法设计模式就派上用场了。
类并不知道需要创建的是什么子类。
子类可以指定应该创建什么样的对象。
父类会委托它的子类创建对象。
JDBC是该模式的一个很好的例子;数据库应用程序不需要知道它将使用哪种数据库,所以它也不知道应该使用什么具体的数据库驱动类。相反,它使用工厂方法来获取连接、语句和其它对象,这使得改变后台数据库变得非常灵活同时并不会改变你的DAO层。
本文出自 “蚂蚁” 博客,请务必保留此出处http://haolloyin.blog.51cto.com/1177454/332802
通用类图如下:
![](http://img1.51cto.com/attachment/201007/174906629.jpg)
例如,我们现在有两种产品A和B,而产品A和B分别都有两个厂商1和2进行生产,在这里我们把不同的厂商1、厂商2理解为牌子1和牌子2,那么厂商1就生产A1、B1,厂商2生产A2、B2。
此时,不同的厂商肯定要生产自己的产品(如A1、B1),每个厂商都有自己的一系列产品,这就与上面抽象工厂模式的描述类似了。
该例子的类图如下:
![](http://img1.51cto.com/attachment/201007/174928984.jpg)
具体代码实现如下:
//定义不同的产品之间的一定具备的标准,用interface实现 //其中的method()方法可看作提取出不同产品的共性,如手机都有类似的功能 interface IProductA{ public void method(); } interface IProductB{ public void method(); }
//实现了产品标准实现的一系列具体产品 //由于已经设计好A1由厂商1生产,故以下输出代码有“厂商x” class ProductA1 implements IProductA{ public void method() { System.out.println("厂商1 生产ProductA1 ..."); } } class ProductA2 implements IProductA{ public void method() { System.out.println("厂商2 生产ProductA2 ..."); } } class ProductB1 implements IProductB{ public void method() { System.out.println("厂商1 生产ProductB1 ..."); } } class ProductB2 implements IProductB{ public void method() { System.out.println("厂商2 生产ProductB2 ..."); } }
//每一种牌子的产品生产工厂,即不同的厂商负责自己牌子产品的生产 abstract class Factory1{ abstract IProductA getProductA1(); abstract IProductB getProductB1(); } abstract class Factory2{ abstract IProductA getProductA2(); abstract IProductB getProductB2(); }
//具体的工厂用来生产相关的产品 class ConcreteFactory1 extends Factory1{ public IProductA getProductA1() { return new ProductA1(); } public IProductB getProductB1() { return new ProductB1(); } } class ConcreteFactoryB extends Factory2{ public IProductA getProductA2() { return new ProductA2(); } public IProductB getProductB2() { return new ProductB2(); } }
<span style="color:#008000;">//测试类 </span> public class Client { public static void main(String[] args) { //厂商1负责生产产品A1、B1 Factory1 factory1 = new ConcreteFactory1(); IProductA productA1 = factory1.getProductA1(); IProductB productB1 = factory1.getProductB1(); productA1.method(); productB1.method(); //厂商2负责生产产品A2、B2 Factory2 factory2 = new ConcreteFactoryB(); IProductA productA2 = factory2.getProductA2(); IProductB productB2 = factory2.getProductB2(); productA2.method(); productB2.method(); } }
运行结果:
厂商1 生产ProductA1 ... 厂商1 生产ProductB1 ... 厂商2 生产ProductA2 ... 厂商2 生产ProductB2 ... |
其实,上例中本来可以不用到了两个抽象工厂,只剩一个也可,但是这样子与我们现实生活中不同厂商各自生产自己的产品有点不同,所以就将其分开为两个了,也就是将两个厂商完全地分离开。
由上面类图可以知道,一旦任何一个厂商开发出了产品C的话,那么这个厂商肯定需要扩展自己的工厂来投入到C产品的生产中,那么此时工厂1和工厂2就需要进行一定的改变了,这很明显不符合开闭原则。
何时使用工厂方法设计模式?
对象的创建如果需要代码复用却没有现成的代码可用时,工厂方法设计模式就派上用场了。
类并不知道需要创建的是什么子类。
子类可以指定应该创建什么样的对象。
父类会委托它的子类创建对象。
JDBC是该模式的一个很好的例子;数据库应用程序不需要知道它将使用哪种数据库,所以它也不知道应该使用什么具体的数据库驱动类。相反,它使用工厂方法来获取连接、语句和其它对象,这使得改变后台数据库变得非常灵活同时并不会改变你的DAO层。
本文出自 “蚂蚁” 博客,请务必保留此出处http://haolloyin.blog.51cto.com/1177454/332802
相关文章推荐
- JavaWeb学习总结(二)——Tomcat服务器学习和使用(一)
- 在Java中使用json所需要的jar包
- Setting语言与输入法列表客制化
- vim编码设置方法
- Activity启动后EditText自动弹出键盘
- Android 避免APP启动闪黑屏(Theme和Style)
- Linux防火墙iptables详解(四)--iptables实现NAT
- 初识Retrofit2.0
- 4.1、Android Stuido配置你的Build Variant
- 4.1、Android Stuido配置你的Build Variant
- c++获取系统时间,精确到ms级
- centos不启动图形
- 011-最长公共子序列-动态规划-《算法设计技巧与分析》M.H.A学习笔记
- 欢迎使用CSDN-markdown编辑器
- Qt软件开发具有 管理员权限
- perl读写Excel
- 三角蛋糕
- IDEA启动Tomcat报错1099 is already in use
- ImageNet和CNN怎样帮助医学图像的识别
- spring各个jar包的意义