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

    1、概述

    抽象工厂模式是一种创建型模式,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
    图片

    2、模式结构

    • 抽象工厂(IFactory):用于声明生成抽象产品的方法
    • 具体工厂(SqlServerFactory和MySqlFactory):实现了抽象工厂声明的生成抽象产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中;
    • 抽象产品(IBook和IUser):为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法
    • 具体产品(SqlServerBook和MySqlBook等):定义具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法。

    3、使用场景

    • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
    • 系统中有多于一个的产品族,而每次只使用其中某一产品族。
    • 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
    • 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

    4、优缺点

    优点:

    • 易于交换产品系列
    • 具体的创建实例过程从客户端代码分离
    • 符合开闭和依赖倒转原则

    缺点:

    • 增加产品族修改麻烦(对于新的产品种类不符合开-闭原则,为开-闭原则的倾斜性)

    5、实例

    项目中可能会遇到需要多种数据库来操作数据,例如,mysql和sqlserver数据库,这样需要访问数据和业务逻辑解耦。
    首先创建两个实体Book和User

    public class Book {
        private int bookId;
        private String bookName;
    
        public Book(int bookId,String bookName){
            this.bookId=bookId;
            this.bookName=bookName;
        }
    
        public int getBookId() {
            return bookId;
        }
    
        public String getBookName() {
            return bookName;
        }
    }
    
    public class User {
        private int userId;
        private String userName;
    
        public User(int userId, String userName) {
            this.userId = userId;
            this.userName = userName;
        }
    
        public int getUserId() {
            return userId;
        }
    
        public String getUserName() {
            return userName;
        }
    }
    

    其次,创建两个抽象产品IBook和IUser

    public interface IBook {
        int add(Book book);
    
        int remove(int bookId);
    }
    
    public interface IUser {
        int add(User user);
    
        int remove(int userId);
    }
    
    

    根据数据库实现不同的产品

    public class SqlServerBook implements IBook {
        @Override
        public int add(Book book) {
            return 0;
        }
    
        @Override
        public int remove(int bookId) {
            return 0;
        }
    }
    
    public class MySqlBook implements IBook {
        @Override
        public int add(Book book) {
            // 具体的mysql数据库操作
            return 0;
        }
    
        @Override
        public int remove(int bookId) {
            return 0;
        }
    }
    
    public class MySqlUser implements IUser {
    
        @Override
        public int add(User user) {
            return 0;
        }
    
        @Override
        public int remove(int userId) {
            return 0;
        }
    }
    
    public class SqlServerUser implements IUser {
        @Override
        public int add(User user) {
            // 具体的sqlServer数据库操作
            return 0;
        }
    
        @Override
        public int remove(int userId) {
            return 0;
        }
    }
    

    定义一个访问数据库的抽象工厂接口

    public interface IFactory {
        IBook addBook();
    
        IUser addUser();
    }
    

    创建两个具体工厂SqlServerFactory和MySqlFactory

    public class MySqlFactory implements IFactory {
        @Override
        public IBook addBook() {
            return new MySqlBook();
        }
    
        @Override
        public IUser addUser() {
            return new MySqlUser();
        }
    }
    
    public class SqlServerFactory implements IFactory {
        @Override
        public IBook addBook() {
            return new SqlServerBook();
        }
    
        @Override
        public IUser addUser() {
            return new SqlServerUser();
        }
    }
    

    客户端代码:

    public static void main(String[] args) {
        User user = new User(1, "test");
        IFactory factory = new SqlServerFactory();// 可以换成MySqlFactory
        IUser iu = factory.addUser();
        iu.add(user);
    }
    
  • 相关阅读:
    NC外部统一流程管理平台方案
    Activiti 多个并发子流程的应用
    基于Activiti的流程应用开发平台JSAAS-WF V5.3
    整合Acitiviti在线流程设计器(Activiti-Modeler 5.18.0)
    基于Spring Security 的JSaaS应用的权限管理
    微信分享功能开发
    ORACLE schedule job设置
    存储过程清理N天前数据
    oracle函数trunc的使用
    往前往后推时间(排除工作日和节假日)
  • 原文地址:https://www.cnblogs.com/fomin/p/9781128.html
Copyright © 2011-2022 走看看