抽象工厂模式
interface Shoe{
void wear();
}
定义鞋类接口,定义公共方法穿鞋子。
interface Hat{
void wear();
}
定义帽子类接口,定义公共方法戴帽子。
class LeatherShoe implements Shoe{
public LeatherShoe(){
}
public void wear(){
//穿皮鞋
}
}
皮鞋实体类
class ClothShoe implements Shoe{
public ClothShoe(){
}
public void wear(){
//穿布鞋
}
}
布鞋实体类
class LeatherHat implements Hat{
public LeatherHat(){
}
public void wear(){
//带皮帽
}
}
皮帽实体类
class ClothHat implements Hat{
public ClothHat(){
}
public void wear(){
//戴草帽
}
}
草帽实体类
interface Factory{
Shoe createShoe();
Hat creatHat();
}
工厂接口
class ClothFactory implements Factory{
public Shoe createShoe(){
ClothShoe clothShoe = new ClothShoe();
return clothShoe;
}
public Hat creatHat(){
ClothHat clothHat = new ClothHat();
return clothHat;
}
}
布料工厂类
class LeatherFactory implements Factory{
public Shoe createShoe(){
LeatherShoe leatherShoe = new LeatherShoe();
return leatherShoe;
}
public Hat creatHat(){
LeatherHat leatherHat = new LeatherHat();
return leatherHat;
}
}
皮料工厂类
class Client{
public static void main(String args[]){
Shoe mShoe;
Hat mHat;
Factory mFactory;
mFactory = new ClothFactory();//创建布料工厂
mShoe = mFactory.createShoe();//工厂生产鞋
mHat = mFactory.creatHat();//工厂生产帽子
mShoe.wear();//穿布鞋
mHat.wear();//戴帽子
}
}
客户端
优点
- 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离, 更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接 口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
- 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产 品族中的对象。
- 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点
- 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码, 这显然会带来较大的不便,违背了“开闭原则”。