前面学习了简单工厂和工厂方法模式,今天来学习工厂模式中最最抽象的一种-- 抽象工厂模式。抽象工厂模式比工厂方法处理的问题更具有抽象性与一般性。它们的区别在于: 工厂方法模式针对的是一个产品等级结构;而抽象工厂模式是针对多个产品等级结构而出现的。
说的通俗点,一个产品等级结构就是一类产品类的总称;例如: 运动鞋,休闲鞋,皮鞋等,所有鞋的种类就构成一个鞋的等级结构。而当两个或两个以上具有相同或相似等级结构的产品组合在一起时,或者在此基础上添加新的产品等级结构时,使用抽象工厂模式,就为这种添加或修改带来了更好的灵活性。下面以一个例子来说明抽象工厂模式的实用性。
在学习工厂方法模式的时候,提到了一个例子,制鞋厂扩大生成规模,由本来只生产一种类型的鞋子,扩大到生产各色各样的鞋子类型。现在制鞋厂又想进一步扩大自己的市场;在原来制造鞋子的基础上,也制造衣服。并且希望推出其对应的运行型套装,商务型套装,休闲型套装等等一系列的自主品牌产品。这样问题就来了,如果以原来工厂方法的模式来设计,一个具体产品,对应一个具体工厂,那么新加入服饰产品,也要相应提供其具体服饰产品的工厂类。这样就会造成工厂泛滥的情况。在实际中,也不可能会出现为生成一种产品,就建一个工厂的情况。
所以,我们就必须考虑使用抽象工厂模式去解决以上的问题。将同一类型的不同产品统一由一个具体工厂创建。下面为该例子的代码实现。
/**
* 鞋子产品抽象类
* @author Administrator
*
*/
public abstract class Shoe {
/*
* 鞋子属性
*/
private String color; // 鞋子颜色
private String size; // 码数
/*
* 提供默认的构造方法
*/
public Shoe(){
this.color = "红色";
this.size = "43";
}
/*
* 行为
*/
public abstract void walk();
/*
* 访问其属性的方法
*/
public String showColor(){
return this.color;
}
public String showSize(){
return this.size;
}
/**
* 运动鞋产品类
* @author Administrator
*
*/
public class SportShoe extends Shoe {
@Override
public void walk() {
// TODO Auto-generated method stub
System.out.println("do something...");
}
}
/**
* 商务型皮鞋
* @author Administrator
*
*/
public class BuniessShoe extends Shoe {
@Override
public void walk() {
// TODO Auto-generated method stub
System.out.println("do something...");
}
}
/*
* 衣服抽象类
*/
public abstract class Clothes {
/*
* 属性
*/
private String color;
private String size;
public Clothes(){
this.color = "红色";
this.size = "180cm";
}
public abstract void wear();
public class SportClothes extends Clothes {
@Override
public void wear() {
// TODO Auto-generated method stub
System.out.println("sport wear...");
}
}
public class BuniessClothes extends Clothes {
@Override
public void wear() {
// TODO Auto-generated method stub
System.out.println("buniess wear...");
}
}
工厂类
/**
* 抽象工厂类,类中定义了两个创建方法
*/
public abstract class Factory {
// 生产鞋子
public abstract Shoe createShoe();
// 生产衣服
public abstract Clothes createClothes();
}
/**
* 运动型品牌工厂类
* @author Administrator
*
*/
public class SportFactory extends Factory {
@Override
public Clothes createClothes() {
// TODO Auto-generated method stub
return new SportClothes();
}
@Override
public Shoe createShoe() {
// TODO Auto-generated method stub
return new SportShoe();
}
}
/**
* 商务型品牌工厂类
* @author Administrator
*
*/
public class BuniessFactory extends Factory {
@Override
public Clothes createClothes() {
// TODO Auto-generated method stub
return new BuniessClothes();
}
@Override
public Shoe createShoe() {
// TODO Auto-generated method stub
return new BuniessShoe();
}
}
测试类
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* 抽象工厂模式的测试类
*/
// 首先我想使用一个运动工厂,创建一套运动服
Factory sportFactory = new SportFactory();
Clothes sportClothes = sportFactory.createClothes();
Shoe sportShoe = sportFactory.createShoe();
sportClothes.wear();
sportShoe.walk();
// 然后我想创建一个商务工厂,创建一套商务套装
Factory buniessFactory = new BuniessFactory();
Clothes buniessClothes = buniessFactory.createClothes();
Shoe buniessShoe = buniessFactory.createShoe();
buniessClothes.wear();
buniessShoe.walk();
}
}