zoukankan      html  css  js  c++  java
  • 抽象工厂模式(Abstract Factory)

    抽象工厂模式(Abstract Factory)

    模式定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

    抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产同一个等级的产品,而抽象工厂模式可生产多个等级的产品。

    应用场景:

    • 程序需要处理不同系列的相关产品,但是你不希望它依赖于这些产品的具体类。

    优点:

    • 1 可以确信你从工厂得到的产品彼此是兼容的
    • 2 可以避免具体产品和客户端代码之间的紧密耦合
    • 3 复合单一职责原则
    • 4 复合开闭原则

    缺点:

    • 1:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

    模式的结构

    抽象工厂模式的主要角色如下。

    1. 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 new Product(),可以创建多个不同等级的产品。
    2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
    3. 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
    4. 具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。

    java代码实现:

    package AbstractFactory;
    
    /**
     * @author noob
     * @created 2020-07 29 14:00
     */
    public class AbstractFactoryTest {
        public static void main(String[] args) {
    
    //        IDatabaseUtils iDatabaseUtils = new MysqlDatabaseUtils();
    //        IConnection connection = iDatabaseUtils.getConnection();
    //        connection.connect();
    //        ICommand command = iDatabaseUtils.getCommand();
    //        command.command();
    
    
            IDatabaseUtils iDatabaseUtils = new OracleDatabaseUtils();
            IConnection connection = iDatabaseUtils.getConnection();
            connection.connect();
            ICommand command = iDatabaseUtils.getCommand();
            command.command();
    
    
    
        }
    }
    //变化 :mysql,oracle。。。
    //  connection,command
    
    
    //抽象产品 :连接类
    interface IConnection{
        void  connect();
    }
    
    //:具体产品:mysql连接
    class  MysqlConnection implements IConnection{
        @Override
        public void connect(){
            System.out.println("mysql connected.");
    
        }
    }
    
    //具体产品oracle连接
    class OracleConnection implements IConnection{
    
        @Override
        public void connect() {
            System.out.println("oracle connected");
        }
    }
    
    //抽象产品:命令类
    interface ICommand{
        void  command();
    }
    
    //具体产品:mysql命令
    class  MysqlCommand implements ICommand{
    
        @Override
        public void command() {
            System.out.println("mysql command.");
        }
    }
    
    //具体产品:oralce命令
    class  OracleCommand implements  ICommand{
    
        @Override
        public void command() {
            System.out.println("oracle command.");
        }
    }
    
    
    
    
    
    //一组相关的接口,抽象工厂接口
    interface  IDatabaseUtils{
        IConnection getConnection();
        ICommand getCommand();
    }
    
    //具体工厂mysql
    class MysqlDatabaseUtils implements IDatabaseUtils{
    
        @Override
        public IConnection getConnection() {
            return new MysqlConnection();
        }
    
        @Override
        public ICommand getCommand() {
            return  new MysqlCommand();
        }
    }
    
    //具体工厂2oracle
    class  OracleDatabaseUtils implements IDatabaseUtils{
    
        @Override
        public IConnection getConnection() {
            return new OracleConnection();
        }
    
        @Override
        public ICommand getCommand() {
            return new OracleCommand();
        }
    }
    

    JDK源码中的应用

    double shift +search everywhere :java.sql.Con...
    1:java.sql.Connection
    2:java.sql.Driver
    
  • 相关阅读:
    智能推荐算法演变及学习笔记(三):CTR预估模型综述
    从中国农业银行“雅典娜杯”数据挖掘大赛看金融行业数据分析与建模方法
    智能推荐算法演变及学习笔记(二):基于图模型的智能推荐(含知识图谱/图神经网络)
    (设计模式专题3)模板方法模式
    (设计模式专题2)策略模式
    (设计模式专题1)为什么要使用设计模式?
    关于macOS上常用操作命令(持续更新)
    记录下关于RabbitMQ常用知识点(持续更新)
    EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
    SpringCloud教程二:Ribbon(Finchley版)
  • 原文地址:https://www.cnblogs.com/zhoujun007/p/13397590.html
Copyright © 2011-2022 走看看