Java设计模式之四:抽象工厂模式
2017-07-25 23:07
351 查看
之前的工厂方法模式已经介绍过,如果需要生产的产品种类比较多,那么就需要创建很多的工厂类,例如:
衣服有商务型衣服和运动型衣服,鞋子有商务型鞋子和运动型鞋子,按照之前工厂方法模式的设计思路,应该创建四个工厂才行,这样未必就太麻烦了,这里就来介绍一种另外的创建型模式:抽象工厂模式。
第一步:创建衣服抽象类和鞋子抽象类。
第二步:
创建商务型衣服类 extends 衣服抽象类,运动型衣服类 extends 衣服抽象类。
创建商务型鞋子类 extends 鞋子抽象类,运动型鞋子类 extends 鞋子抽象类。
第三步:创建抽象工厂类
第四步:创建商务型工厂类继承抽象工厂类,创建运动型工厂类继承抽象工厂类 。这里有个问题:按照分类,为什么不是创建衣服工厂类而是创建商务型工厂类呢?
因为这个工厂类是要继承抽象工厂类的,而抽象工厂类的方法是创建衣服和鞋子。如果创建了衣服工厂类继承抽象工厂,总不能让衣服工厂创建鞋子吧。
第五步:测验。
下面是代码:
优点:
1、抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点:
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
PS 衣服和鞋子属于产品树,而运动衣服和运动鞋子被称为产品族。
衣服有商务型衣服和运动型衣服,鞋子有商务型鞋子和运动型鞋子,按照之前工厂方法模式的设计思路,应该创建四个工厂才行,这样未必就太麻烦了,这里就来介绍一种另外的创建型模式:抽象工厂模式。
第一步:创建衣服抽象类和鞋子抽象类。
第二步:
创建商务型衣服类 extends 衣服抽象类,运动型衣服类 extends 衣服抽象类。
创建商务型鞋子类 extends 鞋子抽象类,运动型鞋子类 extends 鞋子抽象类。
第三步:创建抽象工厂类
第四步:创建商务型工厂类继承抽象工厂类,创建运动型工厂类继承抽象工厂类 。这里有个问题:按照分类,为什么不是创建衣服工厂类而是创建商务型工厂类呢?
因为这个工厂类是要继承抽象工厂类的,而抽象工厂类的方法是创建衣服和鞋子。如果创建了衣服工厂类继承抽象工厂,总不能让衣服工厂创建鞋子吧。
第五步:测验。
下面是代码:
public abstract class Cloth { public String name; }
public class BusinessCloth extends Cloth{ public BusinessCloth() { // TODO Auto-generated constructor stub this.name="商务衣服"; } }
public class SportCloth extends Cloth{ public SportCloth() { // TODO Auto-generated constructor stub this.name="运动衣服"; } }
public abstract class Shoe { public String name; }
public class BusinessShoe extends Shoe{ public BusinessShoe() { // TODO Auto-generated constructor stub this.name="商务鞋子"; } }
public class SportShoe extends Shoe{ public SportShoe() { // TODO Auto-generated constructor stub this.name="运动鞋"; } }
public abstract class AbstractFactory { public abstract Cloth produceCloth(); public abstract Shoe produceShoe(); }
public class BusinessFactory extends AbstractFactory{ @Override public Cloth produceCloth() { return new BusinessCloth(); } @Override public Shoe produceShoe() { return new BusinessShoe(); } }
public class SportFactory extends AbstractFactory{ @Override public Cloth produceCloth() { return new SportCloth(); } @Override public Shoe produceShoe() { return new SportShoe(); } }
@Test public void test() { AbstractFactory factory=new SportFactory(); Cloth cloth=factory.produceCloth(); System.out.println(cloth.name); }
优点:
1、抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点:
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
PS 衣服和鞋子属于产品树,而运动衣服和运动鞋子被称为产品族。
相关文章推荐
- java设计模式之抽象工厂模式
- Java经典设计模式-创建型模式-抽象工厂模式(Abstract Factory)
- java设计模式之抽象工厂模式
- JAVA设计模式--抽象工厂模式
- java/android 设计模式学习笔记(4)---抽象工厂模式
- Java设计模式(三):工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)
- java设计模式——抽象工厂模式
- java学习笔记-设计模式4(抽象工厂模式)
- java设计模式 -------- 创建模式 之 抽象工厂模式
- JAVA设计模式:抽象工厂模式
- JAVA设计模式之抽象工厂模式
- Java设计模式——抽象工厂模式(Abstract Factory Pattern)
- Java开发之设计模式--抽象工厂模式(Abstract Factory)
- Java设计模式之抽象工厂模式
- java设计模式之抽象工厂模式
- Java 23种设计模式之抽象工厂模式
- JAVA设计模式(二)----抽象工厂模式
- Java设计模式(三) 抽象工厂模式
- JAVA设计模式之抽象工厂模式
- Java研究之学习设计模式-抽象工厂模式详解