您的位置:首页 > 其它

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

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

我们来看例子:

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

public interface Writer {

public void write();

}
两个实现类:

public class GangBi implements Writer {

@Override
public void write() {
// to do something
}

}
public class MaoBi implements Writer {

@Override
public void write() {
// to do something
}

}
两个工厂类:

public class GangBiFactory implements Provider {

@Override
public Writer produceBi() {
return new GangBi();
}

}
public class MaoBiFactory implements Provider {

@Override
public 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接口类,我们可以添加其他产品类,然后类似上面,添加对应的实现类和工厂类即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息