设计模式之03抽象工厂模式(笔记)
来源:互联网 发布:手机淘宝装修 编辑:程序博客网 时间:2024/05/16 09:10
1 定义:
1.1 定义:抽象工厂模式(AbstractFactory Pattern)Provide an interface ofr creating families of related or dependentobjects without specifying their concrete class.(为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。)
1.2 通用类图:
1.3 通用代码:
抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。我们来看看抽象工厂的通用源代码,首先有两个互相影响的产品线(也叫做产品族,产品种类),例如汽车的左侧门和右侧门,这两个应该是数量相等的——两个对象之间的约束,每个型号的车门都是不一样的,这是产品等级结构约束的。
类图如下:
public abstract class AbstractProductA { //每个产品共有的方法 publicvoid shareMethod(){ } //每个产品相同方法,不同实现 publicabstract void doSomething();} public abstract class AbstractProductB { //每个产品共有的方法 publicvoid shareMethod(){ } //每个产品相同方法,不同实现 publicabstract void doSomething();} public class ProductA_Level_1 extendsAbstractProductA { @Override publicvoid doSomething() { System.out.println("产品A等级1的实现方法"); }} public class ProductA_Level_2 extendsAbstractProductA { @Override publicvoid doSomething() { System.out.println("产品A等级2的实现方法"); }} public class ProductB_Level_1 extendsAbstractProductB { @Override publicvoid doSomething() { System.out.println("产品B等级1的实现方法"); }} public class ProductB_Level_2 extendsAbstractProductB { @Override publicvoid doSomething() { System.out.println("产品B等级2的实现方法"); }}public abstract class AbstractCreator { //创建A产品家族 publicabstract AbstractProductA createProductA(); //创建B产品家族 publicabstract AbstractProductB createProductB();} public class Creator_Level_1 extendsAbstractCreator { //只生产产品等级为1的A产品 publicAbstractProductA createProductA() { returnnew ProductA_Level_1(); } //只生产铲平等级为1的B产品 publicAbstractProductB createProductB() { returnnew ProductB_Level_1(); }} public class Creator_Level_2 extendsAbstractCreator { //只生产产品等级为2的A产品 publicAbstractProductA createProductA() { returnnew ProductA_Level_2(); } //只生产铲平等级为2的B产品 publicAbstractProductB createProductB() { returnnew ProductB_Level_2(); }}
2 优点
2.1 封装性,每个产品的实现类不是高层模块要关心的,它要关心的是:接口,抽象,它不关心对象是如何创建出来的,这是由工厂类创建的,只要知道工厂类是谁,我就能创建出一个需要的对象,省时省力。
2.2 产品族内的约束为非公开状态。在抽象工厂模式中应该有这样一个约束:约束不同等级产品的生产比例。而这样的生产过程对调用工厂类的高层模式来说是透明的,它不需要知道这个约束,它就是要一个这样的产品,具体的产品族内的约束是在工厂内实现的。
3 缺点
最大缺点:产品族扩展非常困难。例如:如果要增加一个产品C,也就是产品家族由原来的2个增加到3个,我们的程序将会大大改动:抽象类AbstractorCreator要增加一个方法createProductC(),然后两个实现类都要修改,这严重违反了开闭原则,而且我们一直说明抽象类和接口是一个契约。而这段代码却显然是“有毒代码”。
4 应用场景
使用场景定义非常简单:一个对象簇(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。例如:一个文本编辑器和一个图片处理器,都是软件实体,但是在*nix下的文件编辑器和windows下的文本编辑器虽然功能和界面都相同,但代码实现是不同的,图片处理器也有类似情况。也就是有了共同的约束条件:操作系统类型。(或分类标准)
5 注意事项
在上述缺点论述中,提到抽象工厂模式的产品族扩展比较困难,但是要清楚是产品族扩展困难,而不是产品等级。在该模式下,产品等级是非常容易扩展的,增加一个产品等级,只要增加一个工厂类负责新增加出来的产品生产任务即可。也就是说横向扩展容易,纵向扩展困难。从横向扩展上来讲,抽象工厂模式还是符合开闭原则的。
6 扩展
暂无
7 范例
(高低等级、功能机智能机)
类图如下:
package _03_AbstractFactory;public interface Phone {//获取手机类别public void getKind();//获取手机功能特性public void getFunctions();//获取手机等级public void getLevel();}public abstract class AbstractFeaturePhone implements Phone{public void getKind() {System.out.println("我是功能机! ");}public void getFunctions() {System.out.println("我只有有限的功能!");}}public class FPhone_Level_High extends AbstractFeaturePhone{@Overridepublic void getLevel() {System.out.println("高端机");}}public class FPhone_Level_Low extends AbstractFeaturePhone{@Overridepublic void getLevel() {System.out.println("低端机");}}public abstract class AbstractSmartPhone implements Phone{public void getKind() {System.out.println("我是智能机! ");}public void getFunctions() {System.out.println("我有无限多的功能!");}}public class SPhone_Level_High extends AbstractSmartPhone{@Overridepublic void getLevel() {System.out.println("高端机");}}public class SPhone_Level_Low extends AbstractSmartPhone{@Overridepublic void getLevel() {System.out.println("低端机");}}public abstract class PhoneFactory {public abstract Phone createFeaturePhone();public abstract Phone createSmartPhone();}public class Creator_Level_High extends PhoneFactory{public Phone createFeaturePhone(){return new FPhone_Level_High();}public Phone createSmartPhone() {return new SPhone_Level_High();}}public class Creator_Level_Low extends PhoneFactory{public Phone createFeaturePhone(){return new FPhone_Level_Low();}public Phone createSmartPhone() {return new SPhone_Level_Low();}}public class Client {public static void main(String[] args) {//第一条产线,产高端机PhoneFactory pfh = new Creator_Level_High();//第二条产线,产高端机PhoneFactory pfl = new Creator_Level_Low();Phone sh = pfh.createSmartPhone();sh.getLevel();sh.getKind();sh.getFunctions();Phone fl = pfl.createFeaturePhone();fl.getLevel();fl.getKind();fl.getFunctions();}}
结果:
高端机
我是智能机!
我有无限多的功能!
低端机
我是功能机!
我只有有限的功能!
- 设计模式之03抽象工厂模式(笔记)
- 设计模式笔记之---抽象工厂模式
- 《设计模式》笔记之抽象工厂模式
- 设计模式之--抽象工厂模式(学习分析笔记)
- java设计模式笔记之抽象工厂
- 设计模式笔记之工厂模式--抽象工厂(Abstract Factory)
- 设计模式学习笔记之抽象工厂设计模式
- 笔记十三:设计模式之简单工厂模式、工厂方法模式、抽象工厂模式
- 设计模式之工厂模式系列(简单工厂,工厂模式,抽象工厂模式)
- 设计模式之Factory(工厂模式,抽象工厂)
- 24种设计模式之工厂模式--(抽象工厂)
- 菜鸟学设计模式系列笔记之抽象工厂模式
- Java学习笔记---设计模式之抽象工厂模式
- Java设计模式笔记之抽象工厂模式
- 设计模式之禅笔记-抽象工厂模式
- 设计模式之抽象工厂
- 设计模式 之 抽象工厂
- 设计模式之抽象工厂
- 在Android上实现多格式多媒体播放器的几种方式
- DNS 报文格式
- usb cdrom support on USB OHCI
- php fckeditor 上传文件(或图片)中文显示为乱码的解决方法(两种方法)
- SRM527 275 DP
- 设计模式之03抽象工厂模式(笔记)
- JAVA类库分析之Vector
- 一些常用的字符转换
- poj 2488( 搜索 )
- Harmonic map
- JVM性能调优
- HashMap,LinkHashMap和TreeMap的区别及适用范围简单记录
- git ssh远程登录
- 显示当前进程