java设计模式(抽象工厂模式)

之前的3种工厂模式中,核心都是工厂类,一个工厂类承担了所有产品的创建工作,如果产品的树形结构需要扩展,就必须在工厂类中为新增的产品增加创建功能,这显然违背了开闭原则----在扩展时不能够修改原来的代码。
为了解决这个问题,我们可以采用抽象工厂模式,即建立与产品类等级相似的工厂等级结构,为每一个产品都提供一个具体的工厂类。

首先创建一个工厂类的接口,它提供了一个接口方法produce()用来创建一个产品,代码如下:

●抽象工厂模式父类
public interface Farm{

public Animal produce();
}


●创建三个工厂类
//Pig工厂类
public class FarmPig implements Farm{

public Animal produce(){

return new Pig();
}
}

//Chicken工厂类
public class FarmChicken implements Farm{

public Animal produce(){

return new Chicken();
}
}

//Sheep工厂类
public class FarmSheep implements Farm{

public Animal produce(){

return new Sheep();
}
}


这样,我们在需要创建三种产品时,只创建对应产品的工厂类来创建各自的产品对象即可,测试程序如下:

 public class FarmTest{

public static void test(int count1,int count2,int count3){

//生产猪
Farm farm1 = new FarmPig();
Animal animal1 = farm1.produce();
//生产鸡
Farm farm2 = new FarmChicken();
Animal animal2 = farm2.produce();
//生产羊
Farm farm3 = new FarmSheep();
Animal animal3 = farm3.produce();

//计算收入
int money1 = animal1.sale()*count1;
int money2 = animal2.sale()*count2;
int money3 = animal3.sale()*count3;
System.out.println("Farm养猪收入:" + money1);
System.out.println("Farm养鸡收入:" + money2);
System.out.println("Farm养羊收入:" + money3);

//计算总收入
int sum = money1 + money2 + money3;
System.out.println("Farm总收入:" + sum);

}

public static void main(String[] args){

FarmTest.test(20,1000,50);
}
}


●何时使用抽象工厂模式
根据以上的扩展讲解可知,抽象工厂适用于产品结构多变或有可能扩展的产品创建中,但实际上,我们大多数的程序都需要给未来的维护留下有扩展的余地,这才符合开闭原则。所以大多数时候,我们都会采用抽象工厂模式。当然这并不表示普通的工厂方法没有适用的场景,如果产品结构比较固定也比较简单,则可以使用,就好比上一节中Swing的工厂BorderFactory所示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值