Android设计模式之抽象工厂模式(二)

上一篇文章讲到简单工厂模式,还没有看到的朋友可以看一下:
Android设计模式之简单工厂模式(一)
简单的工厂模式,使用也比较方便,但是有些细心的朋友也会发现,这种模式也存在不好的缺点,可拓展性差,就是当你要增加一种产品的时候,那么在ProductParent 中你必须加上这种新的产品,必须修改代码,这样子就违反了java的开闭原则,即封闭对代码的修改,开放对代码的拓展。所以今天使用抽象工厂模式,可以规避这种缺点。具体以一个Demo为例。
首先,假设我们有两种不同类型的产品:ProductA,ProductB:
public class ProductA implements ProductParent{
    public ProductA() {
        System.out.println("生成A产品");
    }
}
public class ProductB implements ProductParent{
    public ProductB() {
        System.out.println("生成B产品");
    }
}
再者,我们为这两种产品定义一个共同的总产品接口:ProductParent,并让这两种类型的产品是实现这个接口:
public interface ProductParent {


}
接着,我们分析,既然ProductA和ProductB是不同类型,那么我们再定义这两种产品不同的生产工厂,即:
ProductAFactory,ProductBFactory,ProductAFactory是专门负责生产ProductA产品的,而ProductBFactory
是专门负责生产ProductB产品的,这两个工厂类似于分工厂,只不过生产的产品类型不一样,所以我们再定义一个总工厂IFactory接口,并让分工厂去实现这个接口。代码如下:


public interface IFactory {
ProductParent creatProduceParent();
}


public class ProductAFactory implements IFactory{
@Override
public ProductParent creatProduceParent() {
return new ProductA();
}
}


public class ProductBFactory implements IFactory{
@Override
public ProductParent creatProduceParent() {
return new ProductB();
}
}


通过上面代码可以看到,我们在总工厂IFactory 定义一个生产总产品ProductParent的抽象方法,那么分工厂
ProductAFactory 和ProductBFactory 实现这个方法的时候创建自己的产品ProductA和ProductB。到此,其实
抽象工厂模式的demo已经完了。那么我们怎么使用呢,使用一个测试类TestExample :
public class TestExample {
@Test
    public void produce(){
        IFactory factory = new ProductAFactory();
        ProductParent productA = factory.creatProduceParent();
    }
}
在上述代码中,我们作为调用者,只需要创建你需要产品对应的工厂,然后去调用创建的方法就好。那么这种模式为什么说比简单工厂模式好呢,怎样说它就符合开闭原则呢?好,下面就来分析一下,假如公司由于业务拓展,需要新做类型为ProductC的产品,那么此时我们让ProductC去实现总产品ProductParent接口,然后新建一个分工厂ProductCFactory ,并实现总工厂IFactory,在分工厂生产ProductC产品就可以了。
具体代码如下:
public class ProductC implements ProductParent{
    public ProductC() {
        System.out.println("生成C产品");
    }
}


public class ProductCFactory implements IFactory{
@Override
public ProductParent creatProduceParent() {
return new ProductC();
}
}
生产ProductC只需:
IFactory factory = new ProductCFactory();
        ProductParent productC = factory.creatProduceParent();
综上所述,我们对原来的代码并未做任何修改,只是增加了ProductC 和ProductCFactory 这两个类,而调用者这需要创建出ProductCFactory就可以生产ProductC了,这就是符合开闭原则了,只拓展不修改,好,本文到此,欢迎指正!!!





















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值