23种设计模式之抽象工厂模式
2015-06-23 16:07
330 查看
抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种,业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。
1抽象产品类
产品A1的实现类
抽象工厂类
如何创建一个产品,则是由具体的实现类来完成的呢,代码如下:
产品等级1的实现类:
注意:有M个产品等级就应该有M个实现工厂类,在每个实现工厂中、实现不同的产品族的生产任务。
场景类:
在场景类中,没有任何一个方法与实现类有关系的,对于一个产品来说,我们只要知道它的工厂方法就可以直接生产一个产品对象,无需关心它的实现类。
~~~~~~抽象工厂模式的优点:
封装性。每个产品的实现类不是高层模块要关心的,它要关心的是什么?是接口,是抽象,它不关心对象是如何创建出来的,它是由谁负责的,工厂类只需要知道工厂类是谁,我就能创建出一个需要的对象,省时省力。
~~~~~~缺点:
抽象工厂模式的最大缺点就是产品族扩展非常困难。如果要增加一个产品C,也就是说产品家族由原来的两个增加到三个,抽象类要增加一个方法createProductC(); 然后实现类都要修改,违反了开闭原则。而且我们一直说明抽象类和接口是一个契约,改变契约,所有与契约有关系的代码都要修改,那么这段代码叫有毒代码。
抽象 工厂使用的场景:
抽象工厂模式使用的场景定义非常简单呢,一个对象族都有相同的约束,则可以使用抽象工厂模式。
什么意思呢?例如:一个文本编辑器和一个图像编辑器,都是软件的实体。但是linux下的文本编辑器和windows下的文本编辑器虽然功能和界面都相同,但是代码实现就是不同的,图片处理器也有类似情况,也就是具有了共同的约束条件,操作系统类型。于是我们可以使用抽象工厂模式,产生不同的操作系统下的文本编辑器和图片处理器。
1抽象产品类
public abstract class AbstractProductA { //每个产品共有的方法 public void shareMethod(){} //每个产品相同方法,不同实现 public abstract void doSomething(); }
产品A1的实现类
public class ProductA1 extends AbstractProductA{ @Override public void doSomething() { // TODO Auto-generated method stub System.out.println("产品A1的实现方法"); } }产品A2的实现类
public class ProductA2 extends AbstractProductA{ @Override public void doSomething() { // TODO Auto-generated method stub System.out.println("产品A2的实现方法"); } }产品B与此类似,不再赘述。抽象工厂类AbstractCreator的职责是定义每个工厂要实现的功能,我们定义了两个产品代码如下:
抽象工厂类
public abstract class AbstractCreator { //创建A产品家族 public abstract AbstractProductA createProductA(); //创建B产品家族 public abstract AbstractProductB createProductB(); }注意: 有N个产品族,在抽象工厂类中就应该有N个抽象方法。
如何创建一个产品,则是由具体的实现类来完成的呢,代码如下:
产品等级1的实现类:
public class Creator1 extends AbstractCreator{ //只生产产品等级为1的A产品 @Override public AbstractProductA createProductA() { // TODO Auto-generated method stub return new ProductA1(); } //只生产产品等级为1的B产品 @Override public AbstractProductB createProductB() { // TODO Auto-generated method stub return new ProductB1(); } }产品等级2的实现类:
public class Creator2 extends AbstractCreator{ //只生产产品等级为1的A产品 @Override public AbstractProductA createProductA() { // TODO Auto-generated method stub return new ProductA2(); } //只生产产品等级为2的B产品 @Override public AbstractProductB createProductB() { // TODO Auto-generated method stub return new ProductB2(); } }
注意:有M个产品等级就应该有M个实现工厂类,在每个实现工厂中、实现不同的产品族的生产任务。
场景类:
public class Client { public static void main(String[] args){ //定义出两个工厂 AbstractCreator creator1 = new Creator1(); AbstractCreator creator2 = new Creator2(); //产生A1对象 AbstractProductA a1 = creator1.createProductA(); //产生A2对象 AbstractProductA a2 = creator2.createProductA(); //产生B1对象 AbstractProductB b1 = creator1.createProductB(); //产生B2对象 AbstractProductB b2 = creator2.createProductB(); /** * do Something */ } }
在场景类中,没有任何一个方法与实现类有关系的,对于一个产品来说,我们只要知道它的工厂方法就可以直接生产一个产品对象,无需关心它的实现类。
~~~~~~抽象工厂模式的优点:
封装性。每个产品的实现类不是高层模块要关心的,它要关心的是什么?是接口,是抽象,它不关心对象是如何创建出来的,它是由谁负责的,工厂类只需要知道工厂类是谁,我就能创建出一个需要的对象,省时省力。
~~~~~~缺点:
抽象工厂模式的最大缺点就是产品族扩展非常困难。如果要增加一个产品C,也就是说产品家族由原来的两个增加到三个,抽象类要增加一个方法createProductC(); 然后实现类都要修改,违反了开闭原则。而且我们一直说明抽象类和接口是一个契约,改变契约,所有与契约有关系的代码都要修改,那么这段代码叫有毒代码。
抽象 工厂使用的场景:
抽象工厂模式使用的场景定义非常简单呢,一个对象族都有相同的约束,则可以使用抽象工厂模式。
什么意思呢?例如:一个文本编辑器和一个图像编辑器,都是软件的实体。但是linux下的文本编辑器和windows下的文本编辑器虽然功能和界面都相同,但是代码实现就是不同的,图片处理器也有类似情况,也就是具有了共同的约束条件,操作系统类型。于是我们可以使用抽象工厂模式,产生不同的操作系统下的文本编辑器和图片处理器。
相关文章推荐
- 林地项目杂记1
- CSS抗锯齿 font-smoothing 属性介绍
- 在真机调试 iOS 应用:理解 Certificates, Identifiers & Profiles
- java处理正则表达式
- How to Persuade Others
- Java截取字符串
- 图解Putty Key Generator使用方法
- iOS之MRC与ARC混编的设置
- [数据结构]队列之链式队列的类模板实现
- 线程相关概念解读----应付相关考试
- URAL 1180. Stone Game (博弈 + 规律)
- docker常用管理命令(上)
- 转:Block原理及引用循环问题
- SOA
- 墨菲定律-Murphy's Law (转载)
- ASP.NET ViewState详解
- <Effective C++>读书笔记-5
- 高考志愿,你们想好怎么填了吗?
- gsoap浅析之三
- Android Volley完全解析(一),初识Volley的基本用法