二、工厂模式

一、普通工厂模式

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接口的子类