设计模式——工厂模式

介绍

工厂模式(Factory Pattern),在创建对象时不会对客户端暴露创建逻辑,而是通过一个共同的接口来指向对象的。(即不是通过new去创建对象)。

意图

定义一个创建对象的接口,让子类去决定实例化哪个对象。

解决

接口选择问题

优点

  1. 调用者想创建对象时只需要直到名称即可;
  2. 扩展性高,如果想增加一个产品,只需要扩展一个工厂类即可;
  3. 屏蔽产品的实现,调用者只需要关心产品接口;

缺点

  1. 每次增加产品时都需要新增一个具体类和实现工厂,系统中类的个数成倍增加,一定程度上增加了系统的复杂性

使用场景

  1. 数据库连接(支持MySQL、Oracle、SQLServer、DB2等)
  2. 邮件服务器(支持POP3、IMAP、HTTP等)

UML

示例

DatabaseConnect.java

package cn.geoaryblog.design.cretedg.simplefactory;

public interface DatabaseConnect {
    DatabaseConnect getConnection();
}

MysqlConnection.java

package cn.geoaryblog.design.cretedg.simplefactory;

public class MysqlConnection implements DatabaseConnect {
    @Override
    public DatabaseConnect getConnection() {
        System.out.println("当前是MySQL数据库,返回MySQL数据库连接");
        return null;
    }
}

OracleConnection.java

package cn.geoaryblog.design.cretedg.simplefactory;

public class OracleConnection implements DatabaseConnect {
    @Override
    public DatabaseConnect getConnection() {
        System.out.println("当前是Oracle数据库,返回Oracle数据库连接");
        return null;
    }
}

SQLServerConnection.java

package cn.geoaryblog.design.cretedg.simplefactory;

public class SQLServerConnection implements DatabaseConnect {
    @Override
    public DatabaseConnect getConnection() {
        System.out.println("当前是sqlserver数据库,返回sqlservere数据库连接");
        return null;
    }
}

工厂类 DatabaseConnectionFactory.java

package cn.geoaryblog.design.cretedg.simplefactory;

public class DatabaseConnectionFactory {
    public static DatabaseConnect getCon(String datatype) {
        switch (datatype) {
            case "Oracle":
                return new OracleConnection().getConnection();
            case "MySQL":
                return new MysqlConnection().getConnection();
            case "SQLServer":
                return new SQLServerConnection().getConnection();
            default:
                System.out.println("不支持当前数据库【"+datatype+"】");
                return null;
        }
    }
}

测试方法 SimpleFactoryMain.java

package cn.geoaryblog.design.cretedg.simplefactory;

public class SimpleFactoryMain {
    public static final String DATABASE_MYSQL = "MySQL";
    public static final String DATABASE_ORACLE = "Oracle";
    public static final String DATABASE_SQLSERVER = "SQLServer";
    public static final String DATABASE_DB2 = "DB2";

    public static void main(String[] args) {
        DatabaseConnect connect = DatabaseConnectionFactory.getCon(DATABASE_MYSQL);
        System.out.println(connect);
        // 当前是MySQL数据库,返回MySQL数据库连接
    }
}
posted @ 2022-03-06 17:57  Geoary  阅读(41)  评论(0)    收藏  举报