抽象工厂模式-大话设计模式

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 抽象工厂模式-大话设计模式

一、介绍

抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

AbstractProductA和AbstractProductB是两个抽象产品,之所以为抽象,是因为它们都有可能有两种不同的实现;


IFactory是一个抽象工厂接口,它里面应该包含所有的产品创建的抽象方法。而ConcreteFactory1和ConcreteFactory2就是具体的工厂了。


通常是在运行时刻再创建一个ConcreteFactory类的实例,这个具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应使用不同的具体工厂。

二、代码实现

需求:有两种数据库(mysql、access)需要插入数据和查询数据,SQL有区别。

基础类

public class User {
    private int _id;
    private String _name;
 
    public int get_id() {
        return _id;
    }
 
    public void set_id(int _id) {
        this._id = _id;
    }
 
    public String get_name() {
        return _name;
    }
 
    public void set_name(String _name) {
        this._name = _name;
    }
}
public class Department {
    private int _id;
    private String _name;
 
    public int get_id() {
        return _id;
    }
 
    public void set_id(int _id) {
        this._id = _id;
    }
 
    public String get_name() {
        return _name;
    }
 
    public void set_name(String _name) {
        this._name = _name;
    }
}


产品类

//抽象产品
public interface IUser {
    public void insert(User user);
    public User getUser(int id);
}
 
//抽象产品
public interface IDepartment {
    public void insert(Department department);
    public Department getDepartment(int id);
}
 
public class AccessDepartment implements IDepartment {
    //新增用户
    @Override
    public void insert(Department user){
        System.out.println("在Access中给Department表增加一条记录");
    }
 
    @Override
    public Department getDepartment(int id) {
        System.out.println("在Access中根据用户ID得到一条记录");
        return null;
    }
}
 
public class AccessUser implements IUser {
    //新增用户
    @Override
    public void insert(User user){
        System.out.println("在Access中给User表增加一条记录");
    }
    //查询用户
    @Override
    public User getUser(int id){
        System.out.println("在Access中根据用户ID得到一条记录");
        return null;
    }
}
 
public class SqlserverDepartment implements IDepartment {
    //新增用户
    @Override
    public void insert(Department department){
        System.out.println("在SQL Server中给Department表增加一条记录");
    }
    //查询用户
    @Override
    public Department getDepartment(int id){
        System.out.println("在SQL Server中根据用户ID得到一条记录");
        return null;
    }
}
 
public class SqlserverUser implements IUser {
    //新增用户
    @Override
    public void insert(User user){
        System.out.println("在SQL Server中给User表增加一条记录");
    }
    //查询用户
    @Override
    public User getUser(int id){
        System.out.println("在SQL Server中根据用户ID得到一条记录");
        return null;
    }
}

厂类

//抽象工厂
public interface IFactory {
    public IUser createUser();
 
    public IDepartment createDepartment();
}
 
//具体工厂
public class AccessFactory implements IFactory{
    @Override
    public IUser createUser() {
        return new AccessUser();
    }
 
    @Override
    public IDepartment createDepartment() {
        return new AccessDepartment();
    }
}
 
//具体工厂
public class SqlserverFactory implements IFactory{
    @Override
    public IUser createUser() {
        return new SqlserverUser();
    }
 
    @Override
    public IDepartment createDepartment() {
        return new SqlserverDepartment();
    }
}


测试代码

两种数据切换只需切换具体工厂类

//客户端
public class Client {
    public static void main(String[] args) {
        //数据
        User user = new User();
        Department department = new Department();
 
        //IFactory sqlserverFactory = new AccessFactory();
        IFactory sqlserverFactory = new SqlserverFactory();
        IUser sqlUser = sqlserverFactory.createUser();
        sqlUser.insert(user);
        sqlUser.getUser(1);
        IDepartment sqlDepartment = sqlserverFactory.createDepartment();
        sqlDepartment.insert(department);
        sqlDepartment.getDepartment(1);
 
 
    }
}
在Access中给User表增加一条记录
在Access中根据用户ID得到一条记录
在Access中给Department表增加一条记录
在Access中根据用户ID得到一条记录
 
在SQL Server中给User表增加一条记录
在SQL Server中根据用户ID得到一条记录
在SQL Server中给Department表增加一条记录
在SQL Server中根据用户ID得到一条记录

调试小技巧:使用Ctrl+Alt点击进入实现类的方法。

随着产品越来越多,可以使用反射,取消工厂类的维护:

 
import java.lang.reflect.InvocationTargetException;
 
public class FactoryAll {
    private String db;
 
    public FactoryAll(String db) {
        this.db = db;
    }
 
    public IUser createUser(){
        IUser result=null;
        try {
            result=(IUser)Class.forName("org.minos.chapter15.inter.impl"+"."+db+"User").getDeclaredConstructor().newInstance();
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (IllegalArgumentException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (SecurityException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
 
        return result;
    }
 
 
    public IDepartment createDepartment() {
        IDepartment result=null;
        try {
            result=(IDepartment)Class.forName("org.minos.chapter15.inter.impl"+"."+db+"Department").getDeclaredConstructor().newInstance();
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (IllegalArgumentException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        } catch (SecurityException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
 
        return result;
    }
}
 public static void main(String[] args) {
        //数据
        User user = new User();
        Department department = new Department();
 
        //IFactory sqlserverFactory = new AccessFactory();
        FactoryAll sqlserverFactory = new FactoryAll("Sqlserver");
        //IFactory sqlserverFactory = new SqlserverFactory();
        IUser sqlUser = sqlserverFactory.createUser();
        sqlUser.insert(user);
        sqlUser.getUser(1);
        IDepartment sqlDepartment = sqlserverFactory.createDepartment();
        sqlDepartment.insert(department);
        sqlDepartment.getDepartment(1);
 
 
    }
在SQL Server中给User表增加一条记录
在SQL Server中根据用户ID得到一条记录
在SQL Server中给Department表增加一条记录
在SQL Server中根据用户ID得到一条记录

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
4月前
|
设计模式 PHP
php设计模式--抽象工厂模式(二)
php设计模式--抽象工厂模式(二)
28 0
|
3月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
29 5
|
2天前
|
设计模式 Java
Java设计模式-抽象工厂模式(5)
Java设计模式-抽象工厂模式(5)
|
4月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
4月前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
55 2
|
4月前
|
设计模式 Java
【设计模式系列笔记】抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种设计模式,属于创建型模式之一。它提供了一种方式来创建一系列相关或相互依赖的对象,而无需指定它们具体的类。抽象工厂模式通过引入抽象的工厂接口,使得客户端代码可以使用抽象的接口来创建一组相关的产品,而不关心这些产品的具体实现。
168 4
|
29天前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
31 1
|
1月前
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
1月前
|
设计模式 Java C语言
设计模式-----------工厂模式之抽象工厂模式(创建型)
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类,从而增强了程序的可扩展性并确保客户端只使用同一产品族的产品。
设计模式-----------工厂模式之抽象工厂模式(创建型)
|
1月前
|
设计模式 存储 XML
[设计模式]创建型模式-抽象工厂模式
[设计模式]创建型模式-抽象工厂模式