简述
当系统准备为用户提供一系列相关的对象,又不想让用户代码和创建这些对象的类形成耦合时,就可以使用抽象工厂模式来设计系统。抽象工厂模式的关键是在一个抽象类或接口中定义若干个抽象方法,这些抽象方法分别返回某个类的实例,该抽象类或接口让其子类或实现该接口的类重写这些抽象方法为用户提供一系列相关的对象。
类图
抽象工厂的四种角色
- 抽象产品(Prodcut)
- 具体产品(ConcreteProduct)
- 抽象工厂(AbstractFactory)
- 具体构造者(ConcreteFactory)
抽象工厂的优点
- 抽象工厂模式可以为用户创建一系列相关的对象,使得用户和创建这些对象的类脱耦。
- 使用抽象工厂模式可以方便的为用户配置一系列对象。用户使用不同的具体工厂就能得到一组相关的对象,同时也能避免用户混用不同系列中的对象。
- 在抽象工厂模式中,面对新的“具体产品” ,可以随时增加“具体工厂”为用户提供一组相关的对象。
案例
- 抽象产品(Prodcut)
/**
* 抽象产品 -- 上衣
* @author hjw
*
*/
public abstract class Tops {
public abstract int getChestSize();
public abstract int getHeight();
public abstract String getName();
}
/**
* 抽象产品 -- 裤子
* @author hjw
*
*/
public abstract class Trousers {
public abstract int getWaistSize();
public abstract int getHeight();
public abstract String getName();
}
- 具体产品(ConcreteProduct)
/**
* 具体产品 -- 西装上衣
* @author hjw
*
*/
public class WesternTops extends Tops {
private int chestSize;
private int height;
private String name;
WesternTops(String name,int chestSize,int height){
this.name=name;
this.chestSize=chestSize;
this.height=height;
}
@Override
public int getChestSize() {
// TODO Auto-generated method stub
return 0;
}
@Override
public int getHeight() {
// TODO Auto-generated method stub
return 0;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return null;
}
}
/**
* 具体产品
* @author hjw
*
*/
public class CowboyTops extends Tops {
private int chestSize;
private int height;
private String name;
CowboyTops(String name,int chestSize,int height){
this.name=name;
this.chestSize=chestSize;
this.height=height;
}
public int getChestSize(){
return chestSize;
}
public int getHeight(){
return height;
}
public String getName(){
return name;
}
}
/**
* 具体产品
* @author hjw
*
*/
public class CowboyTrousers extends Trousers {
private int waistSize;
private int height;
private String name;
CowboyTrousers(String name,int waistSize,int height){
this.name=name;
this.waistSize=waistSize;
this.height=height;
}
public int getWaistSize(){
return waistSize;
}
public int getHeight(){
return height;
}
public String getName(){
return name;
}
}
/**
* 具体产品
* @author hjw
*
*/
public class WesternTrousers extends Trousers {
private int waistSize;
private int height;
private String name;
WesternTrousers(String name,int waistSize,int height){
this.name=name;
this.waistSize=waistSize;
this.height=height;
}
public int getWaistSize(){
return waistSize;
}
public int getHeight(){
return height;
}
public String getName(){
return name;
}
}
- 抽象工厂(AbstractFactory)
在这里插入代码片
/**
* 抽象工厂
* @author hjw
*
*/
public abstract class ClothesFactory {
public abstract Tops createTops(int chestSize,int height);
public abstract Trousers createTrousers(int waistSize,int height);
}
- 具体构造者(ConcreteFactory)
/**
* 具体工厂
* @author hjw
*
*/
public class BeijingClothesFactory extends ClothesFactory {
public Tops createTops(int chestSize,int height){
return new WesternTops("北京牌西服上衣",chestSize,height);
}
public Trousers createTrousers(int waistSize,int height){
return new WesternTrousers("北京牌西服裤子",waistSize,height);
}
}
/**
* 具体工厂
* @author hjw
*
*/
public class ShanghaiClothesFactory extends ClothesFactory {
public Tops createTops(int chestSize, int height) {
return new CowboyTops("上海牌牛仔上衣", chestSize, height);
}
public Trousers createTrousers(int waistSize, int height) {
return new CowboyTrousers("上海牌牛仔裤", waistSize, height);
}
}