抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式中的有以下的四种角色:
抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品(Concrete Product)角色:这个角色用以代表具体的产品。
抽象工厂模式就相当于创建实例对象的new,由于经常要根据类生成实例对象,抽象工厂模式也是用来创建实例对象的,所以在需要新的事例对象时便可以考虑是否使用工厂模式。虽然这样做可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
举例来说:生产餐具和相应食物的工厂,有两个车间,其中一个车间用以生产餐具,一个车间用以生产相应的食物。
当消费者消费时,只需要向相应的具体工厂请求具体餐具和具体食物便可以使用餐具消费食物。
抽象工厂的接口定义如下所示:
public interface KetchenFactory{
public Food getFood();
public TableWare getTableWare();
}
抽象餐具的接口定义如下所示:
public interface TableWare{
public String getTool();
}
抽象食物的接口定义如下所示:
public interface Food{
public String getEatable();
}
具体工厂AKetchen的定义如下所示:
public class AKetchen implements KetchenFactory{
public Food getFood(){
return new Milk();
}
public TableWare getTableWare(){
return new Spoon();
}
}
具体餐具(spoon)的定义如下所示:
public class Spoon implements TableWare{
public String getTool() {
return "spoon";
}
}
具体食物(milk)的定义如下所示:
public class Milk implements Food{
public String getEatable(){
return "milk";
}
}
客户端的定义如下:
public class Client{
public void eat(KetchenFactory k){
System.out.println("A person eat "+k.getFood().getEatable()
+" with "+k.getTableWare().getTool()+"!");
}
public static void main(String[] args){
Client client= new Client();
KetchenFactory kf = new AKetchen();
client.eat(kf);
kf=new BKetchen();
client.eat(kf);
kf= new CKetchen();
client.eat(kf);
}
}