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
    
  • 相关阅读:
    ExtJS 基础解析之【Ext.Window】
    螺旋队列算法分析 (转载)
    字符串NSString中去掉空格
    iOSCocos2d使用Zwoptex生成plist文件
    获取网上流视频总时长和当前播放时长
    popToViewController导航条跳转的用法
    iOS: Device token and registerForRemoteNotificationTypes, didReceiveRemoteNotification
    UILabel的详细使用及特殊效果
    UITextView使用sizeWithFont:计算自适应文本高度
    iPhone开放播放gif动画
  • 原文地址:https://www.cnblogs.com/zhoujun007/p/13397590.html
Copyright © 2011-2022 走看看