博客 / 詳情

返回

二、工廠模式

一、普通工廠模式

1.1、模式定義:

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

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");
   }
}

上面代碼的運行結果如下:
image

1.5、源碼中的應用

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

二、抽象工廠模式

2.1、模式定義

  提供一個創建一系列相關或互相依賴對象的接口,而無需指定它們具體的類
clipboard

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();
   }
}

上面代碼的運行結果如下:
image

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

image

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

image

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.