【设计模式】抽象工厂模式

简述

当系统准备为用户提供一系列相关的对象,又不想让用户代码和创建这些对象的类形成耦合时,就可以使用抽象工厂模式来设计系统。抽象工厂模式的关键是在一个抽象类或接口中定义若干个抽象方法,这些抽象方法分别返回某个类的实例,该抽象类或接口让其子类或实现该接口的类重写这些抽象方法为用户提供一系列相关的对象。

类图

抽象工厂的四种角色

  • 抽象产品(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);
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值