atwood-pan

 

04-设计模式—抽象工厂模式

设计模式—抽象工厂模式

模式定义

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

Class Diagram

抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。

抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 createProductA() 和 createProductB() 方法都是让子类来实现,这两个方法单独来看就是在创建一个对象,这符合工厂方法模式的定义。

至于创建对象的家族这一概念是在 Client 体现,Client 要通过 AbstractFactory 同时调用两个方法来创建出两个对象,在这里这两个对象就有很大的相关性,Client 需要同时创建出这两个对象。

从高层次来看,抽象工厂使用了组合,即 Cilent 组合了 AbstractFactory,而工厂方法模式使用了继承。

Luh5xH.png

应用场景

程序需要处理不同系列的相关产品(MySql与Oracle),但是您不希望它依赖这些产品的具体类时

优点

  1. 可以确信你从工厂得到的产品彼此是兼容
  2. 可以避免具体产品和客户端代码之间的紧密耦合
  3. 符合单一职责原则
  4. 符合开闭原则
/**
* @program: DesignPatterns
* @description: 抽象工厂模式
* @author: Coder_Pan
* @create: 2022-04-13 09:10
**/
public class AbstractFactory {
public static void main(String[] args) {
System.out.println("抽象工厂.....提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类");
System.out.println("______________________________________");
/**
* 创建Mysql实例对象
*/
IDataBaseUtils iDataBaseUtils = new MysqlDataBaseUtils();
//获取连接
IConnection connection = iDataBaseUtils.getConnection();
connection.connect();
//发送命令
ICommand command = iDataBaseUtils.getCommand();
command.command();
System.out.println("______________________________________");
/**
* 创建Oracle实例对象
*/
OracleDataBaseUtils oracleDataBaseUtils = new OracleDataBaseUtils();
//获取连接
IConnection oracleDataConnection = oracleDataBaseUtils.getConnection();
oracleDataConnection.connect();
//发送命令
ICommand oracleDataBaseUtilsCommand = oracleDataBaseUtils.getCommand();
oracleDataBaseUtilsCommand.command();
}
}
/** ==接口==
* 模拟数据库连接池
*/
interface IConnection {
/**
* 数据库连接
*/
void connect();
}
/**
* 模拟数据库操作
*/
interface ICommand {
/**
* 数据库操作 = > 命令发送
*/
void command();
}
/**
* 基础接口
*
* 将两个操作组合在一起
*
* 这就是一系列相关或互相依赖对象的接口
*/
interface IDataBaseUtils {
/**
* 获取连接
* @return
*/
IConnection getConnection();
/**
* 发送命令
* @return
*/
ICommand getCommand();
}
/** ==实现类==
* 实现MySQL连接池
*/
class MySqlConnection implements IConnection {
@Override
public void connect() {
System.out.println("实现MySQL连接池......");
}
}
/**
* 实现Oracle连接池
*/
class OracleConnection implements IConnection {
@Override
public void connect() {
System.out.println("实现Oracle连接池......");
}
}
/**
* 实现Mysql命令
*/
class MySqlCommand implements ICommand {
@Override
public void command() {
System.out.println("实现Mysql命令......");
}
}
/**
* 实现Mysql命令
*/
class OracleCommand implements ICommand {
@Override
public void command() {
System.out.println("实现Oracle命令......");
}
}
/**
* Mysql实例创建
*/
class MysqlDataBaseUtils implements IDataBaseUtils {
@Override
public IConnection getConnection() {
return new MySqlConnection();
}
@Override
public ICommand getCommand() {
return new MySqlCommand();
}
}
/**
* Oracle实例创建
*/
class OracleDataBaseUtils implements IDataBaseUtils {
@Override
public IConnection getConnection() {
return new OracleConnection();
}
@Override
public ICommand getCommand() {
return new OracleCommand();
}
}

posted on   JavaCoderPan  阅读(13)  评论(0编辑  收藏  举报  

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南

导航

统计

点击右上角即可分享
微信分享提示