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

本文介绍了抽象工厂模式,它是工厂方法模式的泛化形式。文章详细阐述了抽象工厂模式的角色,包括抽象工厂、具体工厂、抽象产品和具体产品。讨论了模式的优缺点,如高内聚低耦合和增加新产品的不便。适用环境包括用户不需要关心对象创建过程,以及存在多个产品族等。同时,文章提供了一个数据库连接和语句对象的示例,展示了如何使用抽象工厂模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

抽象工厂模式是工厂方法模式的泛化版,工厂方法模式是一种特殊的抽象工厂模式。
抽象工厂模式包含以下角色:
1、抽象工厂
抽象工厂声明生成抽象产品的一组方法,每一个方法对应一个产品等级。

2、具体工厂
实现了抽象工厂声明的方法,生成具体产品,每一个产品都位于某个产品等级结构中。

3、抽象产品
抽象产品为具体产品声明接口,定义了产品的抽象业务方法。

4、具体产品
定义具体工厂生产的具体产品对象,实现抽象产品接口定义的业务方法。


优缺点

优点:
1、隔离了具体类的生成,并且实现高内聚低耦合的设计目的。
2、增加新的具体工厂和产品很方便,无需修改已有系统,符合“开闭原则”。

缺点:
添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品。
因为在抽象工厂中规定了所有可能被创建的产品集合,要支持新种类的产品意味着要对该接口进行扩展,而这将涉及对抽象工厂及其所有子类的修改,有很大的不便。


模式适用环境

1、用户无需关心对象的创建过程,对象的创建和使用解耦。
2、产品中有多于一个产品族,而每次只使用其中某一个产品族。。
3、属于同一个产品族的产品将在一起使用。
4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。


又是一个栗子

某系统为了改进数据库操作的性能,自定义数据库连接对象Connection和语句对象Statement,可针对不同类型的数据库提供不同的连接对象和语句对象

分类,抽象产品类Connection、Statement,具体产品类OracleConnection、MySQLConnection、OracleStatement、MySQLStatement,抽象工厂类DBFactory,具体工厂类OracleFactory、MySQLFactory。


详细代码

Connection类

public interface Connection {
}

Statement 类

public interface Statement {
}

MySQLConnection 类

public class MySQLConnection implements Connection {
}

OracleConnection 类

public class OracleConnection implements Connection {
}

OracleStatement 类

public class OracleStatement implements Statement {
}

MySQLStatement 类

public class MySQLStatement implements Statement {
}

DBFactory 类

public interface DBFactory {
    Connection createConnection();
    Statement createStatement();
}

MySQLFactory 类

public class MySQLFactory implements DBFactory {
    @Override
    public Connection createConnection() {
        return new MySQLConnection();
    }

    @Override
    public Statement createStatement() {
        return new MySQLStatement();
    }
}

OracleFactory类

public class OracleFactory implements DBFactory {
    @Override
    public Connection createConnection() {
        return new OracleConnection();
    }

    @Override
    public Statement createStatement() {
        return new OracleStatement();
    }
}

XMLUtils类

public class XMLUtils {
    public static String getClassName() {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(new File("src/config.xml"));
            Node classNode = doc.getElementsByTagName("class").item(0).getFirstChild();
            String type = classNode.getNodeValue().trim();
            return type;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return null;
    }
}

Client类

public class Client {
    public static void main(String[] args) {
        try {
            Class<?> c = Class.forName(XMLUtils.getClassName());
            DBFactory factory = (DBFactory) c.newInstance(); 
            System.out.println(factory.createConnection().getClass().toString());
            System.out.println(factory.createStatement().getClass().toString());
        } catch (ClassNotFoundException e) {
            System.out.println("can not find class!");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

以上就是笔者关于抽象工厂模式的分析与实例展示。
如有错误,欢迎指出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值