抽象工厂方法模式是用途最广的方法模式之一,其主要思想是利用工厂生产组合的复杂实例组,由于工厂、不同的实例组中实例一般都抽象为接口层次,所以很方便添加不同的具体工厂和不同的实例组。主要用于创建一系列相关的对象组或是其他方面。
抽象工厂方法模式类图:
[img]http://dl.iteye.com/upload/attachment/364524/5c72b240-b5e1-3407-a99a-eeeb0379a50b.jpg[/img]
具体实例demo:
建造工厂:
具体工厂1:
具体工厂2:
对象接口:
具体对象:
测试类:
说明:Food接口对应类 Egg Bread;Fruit接口对应类Apple Pear.具体工厂1负责创建Bread或是Apple实例;具体工厂2负责创建Egg或是Pear实例。这样的话 如果只需要Bread或是Apple实例,就可以只用具体工厂1去实现;要另外一组的话 只需要用具体工厂2去创建。而对抽象工厂来说,它不需要关注那一个具体工厂去实现。这样的话就有了更高层次的封装,也满足了开闭原则。
抽象工厂方法模式类图:
[img]http://dl.iteye.com/upload/attachment/364524/5c72b240-b5e1-3407-a99a-eeeb0379a50b.jpg[/img]
具体实例demo:
建造工厂:
package abstractFactory;
public interface CreatorFactory {
Food getFoodInstance();
Fruit getFruitInstance();
}
具体工厂1:
package abstractFactory;
public class ConcreteCreatorFactory1 implements CreatorFactory{
public Food getFoodInstance() {
return new Bread();
}
public Fruit getFruitInstance() {
return new Apple();
}
}
具体工厂2:
package abstractFactory;
public class ConcreteCreatorFactory2 implements CreatorFactory{
public Food getFoodInstance() {
return new Egg();
}
public Fruit getFruitInstance() {
return new Pear();
}
}
对象接口:
package abstractFactory;
public interface Food {
String getFoodName();
}
package abstractFactory;
public interface Fruit {
String getFruitName();
}
具体对象:
package abstractFactory;
public class Apple implements Fruit{
@Override
public String getFruitName(){
// TODO Auto-generated method stub
return "This is apple";
}
}
package abstractFactory;
public class Bread implements Food{
@Override
public String getFoodName() {
// TODO Auto-generated method stub
return "This is Bread which always comes out with Apple.";
}
}
package abstractFactory;
public class Egg implements Food{
@Override
public String getFoodName() {
// TODO Auto-generated method stub
return "This is Bread which always comes out with Apple.";
}
}
package abstractFactory;
public class Pear implements Fruit {
@Override
public String getFruitName() {
// TODO Auto-generated method stub
return "This is pear";
}
}
测试类:
package abstractFactory;
public class AbstractFactoryDemo {
public static void main(String[]args){
CreatorFactory fac=new ConcreteCreatorFactory1();
System.out.println("ConcreteCreatorFactory1 Instance generate the following Instances");
System.out.println(fac.getFoodInstance().getFoodName());
System.out.println(fac.getFruitInstance().getFruitName());
fac= new ConcreteCreatorFactory2();
System.out.println("ConcreteCreatorFactory2 Instance generate the following Instances");
System.out.println(fac.getFoodInstance().getFoodName());
System.out.println(fac.getFruitInstance().getFruitName());
}
}
说明:Food接口对应类 Egg Bread;Fruit接口对应类Apple Pear.具体工厂1负责创建Bread或是Apple实例;具体工厂2负责创建Egg或是Pear实例。这样的话 如果只需要Bread或是Apple实例,就可以只用具体工厂1去实现;要另外一组的话 只需要用具体工厂2去创建。而对抽象工厂来说,它不需要关注那一个具体工厂去实现。这样的话就有了更高层次的封装,也满足了开闭原则。