网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 软件设计 > 设计模式 >

二、工厂模式

时间:2026-02-09 22:47

人气:

作者:admin

标签:

导读:一、普通工厂模式 1.1、模式定义: 定义一个用于创建对象的接口,让子类决定去实例化哪一个类:其中的抽象工厂方法(factoryMethod),就是使得一个类的实例化延迟到了子类。 1.2、应...

一、普通工厂模式

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

上一篇:

下一篇:

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
  • 四、装饰者模式

    四、装饰者模式

    一、模式定义 在不改变原有对象的前提下(不改变ConcreteComponent情况下),给原...
  • 三、适配器模式

    三、适配器模式

    一、模式定义 将一个类的接口转换成使用者希望的另一个接口,Adapter模式使得...
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信