zoukankan      html  css  js  c++  java
  • 设计模式之抽象工厂模式

    定义

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

    结构

    • ProductFactory,抽象产品工厂,声明了一组创建一簇产品的工厂方法,每一个方法对应一种产品。
    • MobileProduct,ComputerProduct,抽象产品,工厂方法返回的接口类型。
    • HuaweiProductFactory,SamsungProductFactory,具体工厂,实现抽象工厂接口,工厂方法返回一簇具体产品。
    • HuaweiMobileProduct,HuaweiComputerProduct,具体产品,抽象产品的实现。

    简单实现

    两种抽象产品

    /**
     * 手机产品
     */
    public interface MobileProduct {
    
      void show();
    
    }
    
    /**
     * 电脑产品
     */
    public interface ComputerProduct {
    
      void show();
    
    }
    

    抽象工厂

    public interface ProductFactory {
    
      /**
       * 创建手机产品
       */
      MobileProduct createMobileProduct();
    
      /**
       * 创建电脑产品
       */
      ComputerProduct createComputerProduct();
    }
    

    具体工厂和具体产品

    /**
     * 华为产品工厂
     */
    public class HuaweiProductFactory implements ProductFactory {
    
      @Override
      public MobileProduct createMobileProduct() {
        return new HuaweiMobileProduct();
      }
    
      @Override
      public ComputerProduct createComputerProduct() {
        return new HuaweiComputerProduct();
      }
    
      public static class HuaweiMobileProduct implements MobileProduct {
    
        @Override
        public void show() {
          System.out.println("HuaweiMobileProduct show");
        }
      }
    
      public static class HuaweiComputerProduct implements ComputerProduct {
    
        @Override
        public void show() {
          System.out.println("HuaweiComputerProduct show");
        }
      }
    }
    

    第二个具体工厂实现

    /**
     * 三星产品工厂
     */
    public class SamsungProductFactory implements ProductFactory {
    
      @Override
      public MobileProduct createMobileProduct() {
        return new SamsungMobileProduct();
      }
    
      @Override
      public ComputerProduct createComputerProduct() {
        return new SamsungComputerProduct();
      }
    
      public static class SamsungMobileProduct implements MobileProduct {
    
        @Override
        public void show() {
          System.out.println("SamsungMobileProduct show");
        }
      }
    
      public static class SamsungComputerProduct implements ComputerProduct {
    
        @Override
        public void show() {
          System.out.println("SamsungComputerProduct show");
        }
      }
    }
    

    客户端

    public class Client {
    
      public static void main(String[] args) {
        ProductFactory productFactory = new SamsungProductFactory();
        productFactory.createMobileProduct().show();
        productFactory.createComputerProduct().show();
      }
    
    }
    

    定义两组产品,华为和三星,每组都有自己的手机产品和电脑产品。

    抽象工厂模式在JDK中的实现

    JDK中操作数据库的接口 Connection

    public interface Connection {
        //创建一个执行对象
        Statement createStatement() throws SQLException;
        //创建一个支持预编译的执行对象
        PreparedStatement prepareStatement(String sql) throws SQLException;
        //创建一个支持存储过程的执行对象
        CallableStatement prepareCall(String sql) throws SQLException;
    }
    

    Connection 就是抽象工厂,Statement,PreparedStatement,CallableStatement 就是抽象产品,各种数据库实现如 MySQL 和 SQLServer 就是具体产品工厂和具体产品。

    总结

    优点

    1. 隔离接口和实现,很容易增加新的产品簇。

    缺点

    1. 增加新的产品类型很麻烦,需要修改原有系统,甚至需要修改抽象层代码,从这个角度看,违背了开闭原则。
    2. 类层次容易变复杂。

    本质

    抽象工厂模式的本质就是选择产品簇的实现,如果只有一种产品就会退化成工厂方法模式。

    使用场景

    1. 产品的创建和使用需要解耦,有多于一个的产品簇,并且产品类型稳定,不会轻易修改,这种情况下可以使用抽象工厂模式。

    参考

    大战设计模式【6】—— 抽象工厂模式
    大战设计模式(第二季)【1】———— 从源码看工厂模式
    设计模式的征途—4.抽象工厂(Abstract Factory)模式
    研磨设计模式-书籍

  • 相关阅读:
    J2那几个E和Web基础
    PHP开发人员对JAVA的WEB开发入门(初版-基础知识)
    一个处理大数据的后台服务(已废弃)
    一个请求过来都经过了什么
    请一定记得升级java虚拟机
    面向对象之 结构体和类的区别
    Swift 结构体的使用
    iOS 波浪效果的实现
    iOS 常用三方(持续更新)
    Xshell 链接 Could not connect to '192.168.80.129' (port 22): Connection failed
  • 原文地址:https://www.cnblogs.com/strongmore/p/15125776.html
Copyright © 2011-2022 走看看