什么情况下使用抽象工厂模式?
a).一个系统不应该依赖于产品类的实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的;
b).这个系统的产品有多于一个产品族,而系统只消费其中某一族的产品;(这是抽象工厂模式的原始用意,某一族的产品就类似于下面例子中,[size=medium][color=red]北方的产品属于一个产品族,热带的产品属于一个产品族[/color][/size])
c).系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现;
水果接口
蔬菜接口
园丁接口(也就是工厂)
北方水果
北方蔬菜
热带水果:
热带蔬菜
[size=medium][color=red]北方园丁(北方工厂)只负责生产北方产品[/color][/size]
[size=medium][color=red]热带园丁(热带工厂)只负责生产热带产品[/color][/size]
客户端调用
输出:
a).一个系统不应该依赖于产品类的实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的;
b).这个系统的产品有多于一个产品族,而系统只消费其中某一族的产品;(这是抽象工厂模式的原始用意,某一族的产品就类似于下面例子中,[size=medium][color=red]北方的产品属于一个产品族,热带的产品属于一个产品族[/color][/size])
c).系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现;
水果接口
package com.wlh.AbstractFactory;
/**
* 水果
* @author Administrator
*
*/
public interface Fruit {
}
蔬菜接口
package com.wlh.AbstractFactory;
/**
* 蔬菜
* @author Administrator
*
*/
public interface Viggie {
}
园丁接口(也就是工厂)
package com.wlh.AbstractFactory;
/**
*园丁(也就是工厂)
*/
public interface Gardener {
public Fruit createFruit();
public Viggie createViggie();
}
北方水果
package com.wlh.AbstractFactory.impl;
import com.wlh.AbstractFactory.Fruit;
public class NorthFruit implements Fruit {
private String name;
public NorthFruit (String name){
this.name=name;
System.out.println("生产出:...."+this.name);
}
}
北方蔬菜
package com.wlh.AbstractFactory.impl;
import com.wlh.AbstractFactory.Viggie;
public class NorthViggie implements Viggie {
private String name;
public NorthViggie(String name) {
this.name=name;
System.out.println("生产出:...."+this.name);
}
}
热带水果:
package com.wlh.AbstractFactory.impl;
import com.wlh.AbstractFactory.Fruit;
public class TropicalFruit implements Fruit {
private String name;
public TropicalFruit(String name){
this.name=name;
System.out.println("生产出:...."+this.name);
}
}
热带蔬菜
package com.wlh.AbstractFactory.impl;
import com.wlh.AbstractFactory.Viggie;
public class TropicalViggie implements Viggie {
private String name;
public TropicalViggie(String name){
this.name=name;
System.out.println("生产出:...."+this.name);
}
}
[size=medium][color=red]北方园丁(北方工厂)只负责生产北方产品[/color][/size]
package com.wlh.AbstractFactory.impl;
import com.wlh.AbstractFactory.Fruit;
import com.wlh.AbstractFactory.Gardener;
import com.wlh.AbstractFactory.Viggie;
public class NorthGardener implements Gardener {
/**
* 种植北方水果
*/
public Fruit createFruit(){
return new NorthFruit("北方水果");
}
/**
* 种植北方蔬菜
*/
public Viggie createViggie(){
return new NorthViggie("北方蔬菜");
}
}
[size=medium][color=red]热带园丁(热带工厂)只负责生产热带产品[/color][/size]
package com.wlh.AbstractFactory.impl;
import com.wlh.AbstractFactory.Fruit;
import com.wlh.AbstractFactory.Gardener;
import com.wlh.AbstractFactory.Viggie;
public class TropicalGardener implements Gardener{
/**
* 种植热带水果
*/
public Fruit createFruit(){
return new TropicalFruit("热带水果") ;
}
/**
* 种植热带蔬菜
*/
public Viggie createViggie(){
return new TropicalViggie("热带蔬菜");
}
}
客户端调用
package com.wlh.AbstractFactory.test;
import com.wlh.AbstractFactory.impl.NorthGardener;
import com.wlh.AbstractFactory.impl.TropicalGardener;
public class CreatTest {
/**
* @param args
*/
public static void main(String[] args) {
new TropicalGardener().createFruit();
new TropicalGardener().createViggie();
new NorthGardener().createFruit();
new NorthGardener().createViggie();
}
}
输出:
生产出:....热带水果
生产出:....热带蔬菜
生产出:....北方水果
生产出:....北方蔬菜