一、普通工廠模式
1.1、模式定義:
定義一個用於創建對象的接口,讓子類決定去實例化哪一個類:其中的抽象工廠方法(factoryMethod),就是使得一個類的實例化延遲到了子類。

1.2、應用場景
①、當使用者不知道要創建的對象的確切類型時候;
②、當使用者希望為庫或者框架提供擴展其內部組件的方法時;
1.3、優點
將具體要創建的對象和創建者解耦:
①、符合單一職責原則
②、符合開閉原則
1.4、一般工廠模式的實現方式
public class FactoryPattern {
public static void main(String[] args) {
Sender s = producer("mail");
s.send();
}
public static Sender producer(String str){
if ("mail".equals(str)){
return new MailSender();
}else if("sms".equals(str)){
return new SmsSender();
}else{
System.out.println("傳入參數有誤");
return null;
}
}
}
interface Sender {
void send();
}
class MailSender implements Sender {
public void send() {
System.out.println("this is a MailSend");
}
}
class SmsSender implements Sender {
public void send() {
System.out.println("this is a SmsSender");
}
}
上面代碼的運行結果如下:

1.5、源碼中的應用
Tomcat源碼中的TomcatURLStreamHandlerFactory.class,該類繼承jdk源碼URLStreamHandlerFactory.interface接口,如下所示:

二、抽象工廠模式
2.1、模式定義
提供一個創建一系列相關或互相依賴對象的接口,而無需指定它們具體的類

2.2、用途
①、只定義了產品和創建產品之間的關係,無需擔心要具體要創建什麼類型的產品;
②、程序只希望依賴產品的接口,而不希望依賴具體的實現類。
2.3、優點
①、符合單一職責原則
②、符合開閉原則
2.4、抽象工廠模式的實現方式
package factory;
public class AbstractFactory {
public static void main(String[] args) {
//此處具體使用創建哪個產品的實例,就會創造出來哪個產品的實例
//IDataBaseUtils相當於抽象工廠,而OracleDataBaseUtils,MysqlDataBaseUtils則是實際創建的工廠
IDataBaseUtils oracleBaseUtils = new OracleDataBaseUtils();
IConnection oracleConnection = oracleBaseUtils.getConnection();
ICommand oracleCommand = oracleBaseUtils.getCommand();
IDataBaseUtils mysqlBaseUtils = new MysqlDataBaseUtils();
IConnection mysqlConnection = mysqlBaseUtils.getConnection();
ICommand mysqlCommand = mysqlBaseUtils.getCommand();
System.out.println("oracle具體工廠創建的實例:"+oracleConnection+".........."+oracleCommand);
System.out.println("mysql具體工廠創建的實例:"+mysqlConnection+".........."+mysqlCommand);
}
}
interface IConnection{
void connect();
}
interface ICommand{
void sendCommand();
}
interface IDataBaseUtils{
IConnection getConnection();
ICommand getCommand();
}
class MysqlConnection implements IConnection{
@Override
public void connect() {
System.out.println("MySql connect....");
}
}
class OracleConnection implements IConnection{
@Override
public void connect() {
System.out.println("Oracle connect....");
}
}
class MysqlCommand implements ICommand{
@Override
public void sendCommand() {
System.out.println("MySql send command");
}
}
class OracleCommand implements ICommand{
@Override
public void sendCommand() {
System.out.println("Oracle send command");
}
}
class MysqlDataBaseUtils implements IDataBaseUtils{
@Override
public IConnection getConnection() {
return new MysqlConnection();
}
@Override
public ICommand getCommand() {
return new MysqlCommand();
}
}
class OracleDataBaseUtils implements IDataBaseUtils{
@Override
public IConnection getConnection() {
return new OracleConnection();
}
@Override
public ICommand getCommand() {
return new OracleCommand();
}
}
上面代碼的運行結果如下:

2.5、源碼應用
2.5.1、JDK源碼中,java.sql.Connection.interface接口的子類

2.5.2、JDK源碼中,java.sql.Driver.interface接口的子類
