设计模式-抽象工厂模式详解

来源:互联网 发布:java interface 调用 编辑:程序博客网 时间:2024/06/05 13:30

上一篇讲到的工厂模式,类的创建依赖工厂类,比如我新添加一种铅笔的对象类,那么就必须在工厂类里面添加对应的方法,这样就违背了设计模式的闭包原则,所以从设计角度考虑,会有一定的问题。所以,我们就可以用抽象工厂模式,比如之前的例子,我们新增一个接口,里面实现一个创建笔的方法,返回值为Writer对象,然后为每个种类的笔的对象都创建一个工厂类,实现这个接口,这样我们新增笔的种类的时候,只需要新增该类的实现类,和该对象的工厂类即可,不需要修改工厂类,这样就符合了闭包原则。

我们来看例子:

所有种类笔对象都必须实现的接口类:

public interface Writer {public void write();}
两个实现类:

public class GangBi implements Writer {@Overridepublic void write() {// to do something}}
public class MaoBi implements Writer {@Overridepublic void write() {// to do something}}
两个工厂类:

public class GangBiFactory implements Provider {@Overridepublic Writer produceBi() {return new GangBi();}}
public class MaoBiFactory implements Provider {@Overridepublic Writer produceBi() {return new MaoBi();}}

provider接口类(统一创建笔的对象接口):

public interface Provider {public Writer produceBi();}
测试类:

public class FactoryTest {public static void main(String[] args) {Provider provider = new GangBiFactory();Writer writer = provider.produceBi();writer.write();}}

这样做好处在于,比如你想添加一种铅笔,只需要做一个实现Writer接口的实现类,然后再做一个工厂类实现Provider接口即可,不用修改之前的代码,这样做,代码扩展性较好。

抽象工厂类的误区:虽然叫抽象工厂类,但是其中并没有抽象方法,网上有些教程把类设计成抽象类,其实并不是抽象工厂模式,抽象模式的英文原话"Provide an interface for creating families of related or dependent objects without specifying their concrete classes",翻译过来就是提供一个用于创建相关或依赖对象的家族的接口,而无需指定具体的类,所以抽象工厂模式上层一定是接口,并且接口里面可以添加多个产品类,比如上面的Provider接口类,我们可以添加其他产品类,然后类似上面,添加对应的实现类和工厂类即可。


原创粉丝点击