GOF 在《设计模式》:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
//抽象工厂角色:工厂接口
public interface Gardener {
public Fruit createFruit(String name);
public Veggie createVeggie(String name);
}
//抽象水果产品角色:水果接口
public interface Fruit {
}
// 抽象蔬菜产品角色:蔬菜接口
public interface Veggie {
}
//具体产品角色:热带水果
public class TropicalFruit implements Fruit {
private String name;
public TropicalFruit(String name) {
System.out.println("热带工厂为您创建了:热带水果-"+name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//具体产品角色:热带蔬菜
public class TropicalVeggie implements Veggie {
private String name;
public TropicalVeggie(String name) {
System.out.println("热带工厂为您创建了:热带水果-"+name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//具体产品角色:亚热带水果
public class NorthernFruit implements Fruit {
private String name;
public NorthernFruit(String name) {
System.out.println("亚热带工厂为您创建了:亚热带水果-"+name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//具体产品角色:亚热带蔬菜
public class NorthernVeggie implements Veggie {
private String name;
public NorthernVeggie(String name) {
System.out.println("亚热带工厂为您创建了:亚热带蔬菜-"+name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//具体工厂角色:热带工厂
public class TropicalGardener implements Gardener {
public Fruit createFruit(String name) {
return new TropicalFruit(name);
}
public Veggie createVeggie(String name) {
return new TropicalVeggie(name);
}
}
//具体工厂角色:亚热带工厂
public class NorthernGardener implements Gardener {
public Fruit createFruit(String name) {
return new NorthernFruit(name);
}
public Veggie createVeggie(String name) {
return new NorthernVeggie(name);
}
}
//工厂模式--抽象工厂模式--一般性模式(农场应用)
public class TestFactoryPattern {
private void test(){
Veggie tv,nv;
Fruit tf,nf;
TropicalGardener tropicalGardener=new TropicalGardener();
NorthernGardener northernGardener=new NorthernGardener();
tv=tropicalGardener.createVeggie("热带南瓜");
nv=northernGardener.createVeggie("北京菠菜");
tf=tropicalGardener.createFruit("新加坡龙眼");
nf=northernGardener.createFruit("河北苹果");
}
public static void main(String args[]){
TestFactoryPattern testFactoryPattern = new TestFactoryPattern();
testFactoryPattern.test();
}
}
http://blog.youkuaiyun.com/jason0539/article/details/23020989
http://blog.youkuaiyun.com/bboyfeiyu/article/details/23939903 //android 工厂模式
http://www.cnblogs.com/qianxudetianxia/archive/2011/08/20/2147011.html