个人随笔
目录
二、创建型-抽象工厂(Abstract Factory)模式
2020-09-09 21:29:24

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

案例

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

1、UML

2、创建DB接口

  1. public interface DB {
  2. public String select();
  3. }

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

  1. public class Oracle implements DB{
  2. @Override
  3. public String select() {
  4. return "Oracle数据库查询";
  5. }
  6. }
  1. public class MySQL implements DB{
  2. @Override
  3. public String select() {
  4. return "MySQL数据库查询";
  5. }
  6. }

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

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

  1. /**
  2. * 工厂接口
  3. * 有新产品的话,直接新建一个工厂实现这个类即可
  4. * @author suibibk.com
  5. *
  6. */
  7. public interface Provide {
  8. public DB product();
  9. }

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

  1. /**
  2. * 专门提供Oracle产品的工厂
  3. * @author suibibk.com
  4. */
  5. public class OracleFactory implements Provide{
  6. @Override
  7. public DB product() {
  8. return new Oracle();
  9. }
  10. }

实现统一的接口Provide.

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

  1. /**
  2. * 专门提供MySQL产品的工厂
  3. * @author suibibk.com
  4. */
  5. public class MySQLFactory implements Provide{
  6. @Override
  7. public DB product() {
  8. return new MySQL();
  9. }
  10. }

实现统一的接口Provide.

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

  1. /**
  2. * 测试类
  3. * @author suibibk.com
  4. *
  5. */
  6. public class App {
  7. public static void main(String[] args) {
  8. Provide provide1 = new OracleFactory();
  9. Provide provide2 = new MySQLFactory();
  10. DB db1 = provide1.product();
  11. DB db2 = provide2.product();
  12. System.out.println(db1.select());
  13. System.out.println(db2.select());
  14. }
  15. }

运行输出如下结果

  1. Oracle数据库查询
  2. MySQL数据库查询

总结

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

 247

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2