玩转设计模式:二、创建型-抽象工厂(Abstract Factory)模式

工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了开闭原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新功能,直接加新的工厂类就可以了,不需要修改之前的代码。

案例

依然是调用数据库的查询方法的例子,数据库有Oracle和MySQL两种。只不过这次不是用一个工厂的方法看来生产产品,而是每个产品用一个新工厂来生产。

1、UML

玩转设计模式:二、创建型-抽象工厂(Abstract Factory)模式

2、创建DB接口

<code>public interface DB {
public String select();
}/<code>

3、创建实现DB接口的Oracle和MySQL类

<code>public class Oracle implements DB{
@Override
public String select() {
return "Oracle数据库查询";
}
}/<code>
<code>public class MySQL implements DB{
@Override
public String select() {
return "MySQL数据库查询";
}
}/<code>

3、创建工厂的统一接口(Provide)

因为这一批产品都是类似的作用,都是用于数据库操作的产品,所以这一批工厂也该约束为类似的左右,只生产数据库有关的产品。

<code>/**
* 工厂接口
* 有新产品的话,直接新建一个工厂实现这个类即可
* @author suibibk.com
*
*/
public interface Provide {
public DB product();
}/<code>

4、Oracle数据库生产工厂(OracleFactory)

<code>/**
* 专门提供Oracle产品的工厂
* @author suibibk.com
*/
public class OracleFactory implements Provide{
@Override
public DB product() {
return new Oracle();
}
}/<code>

实现统一的接口Provide.

5、MySQL数据库生产工厂(MySQLFactory)

<code>/**
* 专门提供MySQL产品的工厂
* @author suibibk.com
*/
public class MySQLFactory implements Provide{
@Override
public DB product() {
return new MySQL();
}
}/<code>

实现统一的接口Provide.

6、测试类,启动测试(App)

<code>/**
* 测试类
* @author suibibk.com
*
*/
public class App {
public static void main(String[] args) {
Provide provide1 = new OracleFactory();
Provide provide2 = new MySQLFactory();
DB db1 = provide1.product();
DB db2 = provide2.product();
System.out.println(db1.select());

System.out.println(db2.select());
}
}/<code>

运行输出如下结果

<code>Oracle数据库查询
MySQL数据库查询/<code>

总结

这个模式的好处就是,如果你现在想增加一个功能:Server-sql,则只需要做一个实现类,实现DB接口,同时做一个工厂类,实现Provider接口,就OK啦,无需要去改动现成的代码。这样做,拓展性较好。


分享到:


相關文章: