设计模式-抽象工厂模式

本文介绍了一种设计模式——抽象工厂模式。通过示例代码详细解释了如何使用抽象工厂模式创建不同类型的对象,如IUser和IDepartment接口的实现类,并展示了如何在客户端代码中利用抽象工厂创建这些对象。

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

今天来介绍一下另一个复杂一点的抽象工厂模式。

1.UML类图


IUser和IDepartment是想要创建的产品的抽象接口,而SqlserverUser、AccessUser和SqlserverDepartment、AccessDepartment分别是其两种不同的具体产品实现类。IFactory是抽象工厂,其中定义了创建两种产品的接口,其具体实现类实现这两个方法根据需求创建不同的IUser和IDepartment实现类。

2.示例代码

IUser接口以及其对应的两个实现类

public interface IUser {
    void insert(User user);

    User getUser(Integer id);
}
public class SqlServerUser implements IUser {
    @Override
    public void insert(User user) {
        System.out.println("在sql server中给user表添加一条记录");
    }

    @Override
    public User getUser(Integer id) {
        System.out.println("在sql server中根据id得到user表一条记录");
        return null;
    }
}
public class AccessUser implements IUser {
    @Override
    public void insert(User user) {
        System.out.println("在access中给user表添加一条记录");
    }

    @Override
    public User getUser(Integer id) {
        System.out.println("在access中根据id得到user表一条记录");
        return null;
    }
}

IDepartment接口以及其对应的实现类

public interface IDepartment {
    void insert(Department department);
    Department getDepartment(Integer id);
}
public class SqlServerDepartment implements IDepartment {
    @Override
    public void insert(Department department) {
        System.out.println("在sql server中给department表添加一条记录");
    }

    @Override
    public Department getDepartment(Integer id) {
        System.out.println("在sql server中根据id得到department表一条记录");
        return null;
    }
}
public class AccessDepartment implements IDepartment {
    @Override
    public void insert(Department department) {
        System.out.println("在access中给department表添加一条记录");
    }

    @Override
    public Department getDepartment(Integer id) {
        System.out.println("在access中根据id得到department表一条记录");
        return null;
    }
}

IFactory抽象工厂以及其对应的两个具体实现工厂,相应的具体工厂中定义了创建User和Department的方法

public interface IFactory {
    IUser createUser();

    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 factory = new SqlServerFactory();
        IUser iu = factory.createUser();
        iu.insert(user);
        iu.getUser(2);
    }
}

3.特点

抽象工厂提供一个创建一系列相关类或相互依赖对象的接口,而无需指定它们具体的类。它使得改变一个应用的具体工厂变得非常容易,它让具体的创建实例的过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值