您的位置:首页 > 编程语言 > Java开发

Java设计模式之四:抽象工厂模式

2017-07-25 23:07 351 查看
之前的工厂方法模式已经介绍过,如果需要生产的产品种类比较多,那么就需要创建很多的工厂类,例如:

衣服有商务型衣服和运动型衣服,鞋子有商务型鞋子和运动型鞋子,按照之前工厂方法模式的设计思路,应该创建四个工厂才行,这样未必就太麻烦了,这里就来介绍一种另外的创建型模式:抽象工厂模式。

第一步:创建衣服抽象类和鞋子抽象类。

第二步:

创建商务型衣服类 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设计模式