抽象工厂模式(别名:配套)
内容:提供一个创建一系列或相互依赖对象的接口,而不用指定它们具体的类。
结构:
1、抽象产品:可以是一个抽象类或接口,定义的具体产品必须实现的方法。
2、具体产品:实现了抽象产品的具体子类。
3、抽象工厂:一个抽象类或接口,定义了一系列产生产品的抽象方法。
4、具体工厂:重写抽象工厂中的抽象方法,返回具体产品的实例。
UML类图:
优点:
可以为用户创建一系列相关的对象,使用户和创建这些对象的类解耦,用户使用不同的具体工厂就能得到一组相关的对象,能避免用户混用不同系列中的产品,同时也可以随时通过添加具体工厂来为用户提供一组相关的对象。
适用情境:
系统需要为用户提供一系列的相关的对象,但不希望用户通过new运算符来实例化这些对象,或不希望用户知道这些对象的关联关系或具体创建过程,用户只需要知道这些对象有哪些方法即可。
使用实例:
//定义抽象产品Clothes
public abstract class Clothes {
public abstract String getClothesName();
}
//定义抽象产品Trousers
public abstract class Trousers {
public abstract String getTrousersName();
}
//具体产品-西装
public class WesternStyleClothes extends Clothes {
private String name;
public WesternStyleClothes(String name){
this.name = name;
}
@Override
public String getClothesName() {
// TODO Auto-generated method stub
return this.name;
}
}
//具体产品-牛仔装
public class CowboyClothes extends Clothes {
private String name;
public CowboyClothes(String name){
this.name = name;
}
@Override
public String getClothesName() {
// TODO Auto-generated method stub
return this.name;
}
}
//定义抽象工厂
public abstract class ClothesFactory {
public abstract Clothes createClothes();
public abstract Trousers createTrousers();
}
//具体工厂A
public class AClothesFactory extends ClothesFactory {
@Override
public Clothes createClothes() {
// TODO Auto-generated method stub
return new WesternStyleClothes("A牌西服");
}
@Override
public Trousers createTrousers() {
// TODO Auto-generated method stub
return new WesternStyleTrousers("A牌西裤");
}
}
//具体工厂B
public class BClothesFactory extends ClothesFactory {
@Override
public Clothes createClothes() {
// TODO Auto-generated method stub
return new CowboyClothes("B牌牛仔服");
}
@Override
public Trousers createTrousers() {
// TODO Auto-generated method stub
return new CowboyTrousers("B牌牛仔裤");
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Clothes clothes;
Trousers trousers;
ClothesFactory clothesFactory = new AClothesFactory();
clothes = clothesFactory.createClothes();
trousers = clothesFactory.createTrousers();
System.out.println("生产出了"+clothes.getClothesName()+","+trousers.getTrousersName());
clothesFactory = new BClothesFactory();
clothes = clothesFactory.createClothes();
trousers = clothesFactory.createTrousers();
System.out.println("生产出了"+clothes.getClothesName()+","+trousers.getTrousersName());
}
}
由具体工厂控制所产生的系列产品,不至于会出现A工厂产生了B系列的产品,同时也可以通过增减不同的具体工厂来构造不同系列的产品,如定义C工厂来产生A牌服装和B牌裤子。