设计模式(一) 抽象工厂(Abstract Factory)
来源:互联网 发布:淘宝手机端图片大小 编辑:程序博客网 时间:2024/04/20 08:14
1.定义
抽象工厂是一种常用的对象创建型设计模式。抽象工厂模式提供了一种方式,可以将一组具有统一主题的单独工厂封装起来,它提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。
2.结构
抽象工厂的结构图如下所示:
AbstractFactory : 声明一个创建抽象产品对象的操作接口
ConcreteFactory : 实现创建具体产品对象的操作
AbstractProduct : 为一个类产品对象声明一个接口
ConcreteProduct : 定义一个将被相应的具体工厂创建产品的对象,实现AbstractProduct
Client : 仅使用由AbstractFactory和AbstractProduct类声明的接口
3.适用性
- 一个系统要独立于它的产品的创建、组合、表示时
- 一个系统要有多个产品系列中的一个类配置时
- 当你要强调一系列相关的产品对象的设计以便进行联合使用时
- 当你提供一个产品类库,而只想显示他们的接口而不是实现时
举个例子说明下,我们定义一个Factory接口,它有createMessageMethod和createPayMethod两个方法,分别表示创建通信方式和创建支付方式。然后定义三个实现Factory接口的类:AliFactory, BaiduFactory, TecentFactory, 在三个类中重写createMessageMethod和createPayMedthod,分别返回每家公司对应的通信方式/支付方式的对象。然后建立MessageMeans和PayMethod接口,用于获取通信方式和支付方式,再分别定义三个类实现这两个接口,定义每家公司对应的实现方式信息。下面请看源码:
Factory.java:
interface Factory {MessageMeans createMessageMethod();PayMethod createPayMethod();}AliFactory.java
public class AliFactory implements Factory {@Overridepublic MessageMeans createMessageMethod() {// TODO Auto-generated method stubreturn new AliMessageMeans();}@Overridepublic PayMethod createPayMethod() {// TODO Auto-generated method stubreturn new AliPayMethod();}}BaiduFactory.java
public class BaiduFactory implements Factory {@Overridepublic MessageMeans createMessageMethod() {// TODO Auto-generated method stubreturn new BaiduMessageMeans();}@Overridepublic PayMethod createPayMethod() {// TODO Auto-generated method stubreturn new BaiduPayMethod();}}TecentFactory.java
public class TecentFactory implements Factory{@Overridepublic MessageMeans createMessageMethod() {// TODO Auto-generated method stubreturn new TecentMessageMeans();}@Overridepublic PayMethod createPayMethod() {// TODO Auto-generated method stubreturn new TecentPayMethod();}}MessageMeans.java
public interface MessageMeans {void getMessageMeans();}AliMessageMeans.java
public class AliMessageMeans implements MessageMeans {@Overridepublic void getMessageMeans() {// TODO Auto-generated method stubSystem.out.println("MessageMeans:来往");}}
BaiduMessageMeans.java
public class BaiduMessageMeans implements MessageMeans {@Overridepublic void getMessageMeans() {// TODO Auto-generated method stubSystem.out.println("MessageMeans:百度Hi");}}TecentMessageMeans.java
public class TecentMessageMeans implements MessageMeans {@Overridepublic void getMessageMeans() {// TODO Auto-generated method stubSystem.out.println("MessageMeans:微信");}}PayMethod.java
interface PayMethod {void getPaymentMethod();}
AliPayMethod.java
public class AliPayMethod implements PayMethod {@Overridepublic void getPaymentMethod() {// TODO Auto-generated method stubSystem.out.println("PaymentMethod:支付宝");}}
BaiduPayMethod.java
public class BaiduPayMethod implements PayMethod {@Overridepublic void getPaymentMethod() {// TODO Auto-generated method stubSystem.out.println("PaymentMethod:百度钱包");}}TecentPayMethod.java
public class TecentPayMethod implements PayMethod {@Overridepublic void getPaymentMethod() {// TODO Auto-generated method stubSystem.out.println("PaymentMethod:微信支付");}}
看了这么多源码,是不是有点头晕~~,其实他们的关系也不是很复杂,我们来理一理:
下面让我们来测试一下功能:
TestFactory
public class TestFactory {private static void testFactory(Factory factory){MessageMeans messageMeans = factory.createMessageMethod();PayMethod paymenMethod = factory.createPayMethod();messageMeans.getMessageMeans();paymenMethod.getPaymentMethod();}public static void main(String[] args) {Factory factory1 = new AliFactory();Factory factory2 = new BaiduFactory();Factory factory3 = new TecentFactory();testFactory(factory1);testFactory(factory2);testFactory(factory3);}}控制台输出:
MessageMeans:来往PaymentMethod:支持宝MessageMeans:百度HiPaymentMethod:百度钱包MessageMeans:微信PaymentMethod:微信支付从测试中我们可以看到,ConcreteFactory(AliFactory, BaiduFactory, TecentFactory)负责创建产品的对象,隐藏了产品对象的实现细节,实现了客户与产品的实现的分离。还有一个ConcreteFactory仅在应用中出现一次,即在其初始化的时候,这使得改变一个应用的具体工厂很容易,比如我们这样写
Factory factoryX = new XiaomiFactory();只要改一行代码就可以更换工厂对象。但是,AbstractFactory难以支持新品种的产品,这是因为AbstractFactory接口确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及AbstractFactory及其所有子类的改变。
参考文献:
1.设计模式:可复用面向对象软件的基础
2.维基百科:抽象工厂
3.设计模式之六--抽象工厂模式
4.从头学习设计模式(四)--- 抽象工厂模式
- 设计模式 一 抽象工厂Abstract Factory(工厂模式)
- 设计模式(一) 抽象工厂(Abstract Factory)
- 抽象工厂(Abstract Factory)设计模式
- 设计模式-抽象工厂(Abstract Factory)
- 抽象工厂(Abstract Factory)设计模式
- 设计模式-抽象工厂(Abstract Factory)
- 设计模式-抽象工厂模式(Abstract Factory)
- 设计模式:抽象工厂模式(Abstract Factory)
- 设计模式(3)抽象工厂模式(Abstract Factory)
- .Net设计模式之抽象工厂模式(Abstract Factory)
- .NET设计模式:抽象工厂模式(Abstract Factory)
- .NET设计模式-抽象工厂模式(Abstract Factory)
- .NET设计模式:抽象工厂模式(Abstract Factory)
- 设计模式3:Abstract Factory Pattern(抽象工厂模式)
- 设计模式(二)之Abstract Factory - 抽象工厂模式
- Java设计模式之抽象工厂(Abstract Factory)模式
- JAVA设计模式之抽象工厂(Abstract Factory)模式
- 设计模式--抽象工厂模式(Abstract Factory)
- hdu 1561 The more, The Better(树形dp)
- PostgreSQL备份与恢复(SQL dump)
- 关于照片在imageView中转置的问题
- js添加标签以及事件和jQuery常用标签详解
- WinPcap编程调试解决办法
- 设计模式(一) 抽象工厂(Abstract Factory)
- 在Activity中显示自定义View
- 浅析Linux线程调度
- hadoop 错误解决
- 魔术师发牌问题
- odex反编译 Cannot locate boot class path file /system/fra mework/core.odex 解决方案
- 我的c语言笔记---动态内存分配
- 在安卓虚拟机中安装apk
- 参数线性回归和梯度下降