设计模式之--抽象工厂模式


抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用java接口或者抽象java类实现,而所有的具体工厂类必须实现这个java接口或者继承这个抽象的java类。
具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。通常使用具体java类实现这个角色。
抽象产品角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用java接口或者抽象java类实现这一角色。
具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这个客户端最终想要的东西,其内部一定充满了应用系统的商业逻辑。通常使用具体java类实现这个角色。

在简单工厂模式和工厂方法模式中提到的农场系统, 在抽象工厂模式中的设计图如下:
首先看其抽象工厂角色:
public interface Garder {
	public Fruit createFruit(String name);
	public Vegetable createVegetable(String name);
}
然后是具体工厂角色:
public class NorthernGarder implements Garder{
	public Fruit createFruit(String name){
		return new NorthernFruit(name);
	}
	public Vegetable createVegetable(String name){
		return new NorthernVegetable(name);
	}
}

public class TropicalGarder implements Garder {
	public Fruit createFruit(String name){
		return new TropicalFruit(name);
	}
	public Vegetable createVegetable(String name){
		return new TropicaVegetable(name);
	}
}
接着是抽象产品角色:
public interface Fruit {}
public interface Vegetable {}
然后是具体产品角色:
public class NorthernFruit implements Fruit {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public NorthernFruit(String name){
		System.out.println("您生产的是亚热带水果");
		this.name = name;
	}
}

public class TropicalFruit implements Fruit {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public TropicalFruit(String name){
		System.out.println("您生产的是热带水果");
		this.name = name;
	}
}

public class NorthernVegetable implements Vegetable{
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public NorthernVegetable(String name){
		System.out.println("您生产的是亚热带蔬菜");
		this.name = name;
	}
}

public class TropicaVegetable implements Vegetable {
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public TropicaVegetable(String name){
		System.out.println("您生产的是热带蔬菜");
		this.name = name;
	}
}
最后是客户端测试程序:
public class Test {
	private static Fruit tropicalFruit, northernFruit;
	private static Vegetable tropicalVegetable, northernVegetable;
	private static Garder tropicalGarder, northernGarder;
	public static void main(String[] args) {
		tropicalGarder = new TropicalGarder();
		northernGarder = new NorthernGarder();
		tropicalFruit = tropicalGarder.createFruit("热带水果");
		tropicalVegetable = tropicalGarder.createVegetable("热带蔬菜");
		northernFruit = northernGarder.createFruit("亚热带水果");
		northernVegetable = northernGarder.createVegetable("亚热带蔬菜");
	}
}
输出结果如下:
您生产的是热带水果
您生产的是热带蔬菜
您生产的是亚热带水果
您生产的是亚热带蔬菜







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值