《设计模式》抽象工厂模式

发布于:2025-08-18 ⋅ 阅读:(17) ⋅ 点赞:(0)

1.抽象工厂模式定义

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

1.1 UML图:

在这里插入图片描述

2.抽象工厂模式举例:

业务场景:需要实现一个数据访问程序。

  • 要求支持两种访问方式 access 和 sqlserver
  • 支持两张表 User表和department表

2.1 UML图:

在这里插入图片描述

2.2 核心代码:

IFactory接口

public interface IFactory {

    public IUser createUser();

    public IDepartment createDepartment();
    
}

IUser接口

public interface IUser {

    public void insert(User user);

    public User getUser(int id);
}

IDepartment接口

public interface IDepartment {

    public void insert(Department department);

    public Department getDepartment(int id);
}

AccessFactory

public class AccessFactory implements IFactory {

    public IUser createUser(){
        return new AccessUser();
    }

    public IDepartment createDepartment(){
        return new AccessDepartment();
    }

}

SqlserverFactory

public class SqlserverFactory implements IFactory {

    public IUser createUser(){
        return new SqlserverUser();
    }
    
    public IDepartment createDepartment(){
        return new SqlserverDepartment();
    }
    
}

AccessUser

public class AccessUser implements IUser {

    //新增一个用户
    public void insert(User user){
        System.out.println("在Access中给User表增加一条记录");     
    }

    //获取一个用户信息
    public User getUser(int id){
        System.out.println("在Access中根据用户ID得到User表一条记录");   
        return null;  
    }

}

SqlserverUser

public class SqlserverUser implements IUser {

    //新增一个用户
    public void insert(User user){
        System.out.println("在SQL Server中给User表增加一条记录");     
    }

    //获取一个用户信息
    public User getUser(int id){
        System.out.println("在SQL Server中根据用户ID得到User表一条记录");   
        return null;  
    }

}

AccessDepartment

public class AccessDepartment implements IDepartment {

    //新增一个部门
    public void insert(Department department){
        System.out.println("在Access中给Department表增加一条记录");     
    }

    //获取一个部门信息
    public Department getDepartment(int id){
        System.out.println("在Access中根据部门ID得到Department表一条记录");   
        return null;  
    }

}

SqlserverDepartment

public class SqlserverDepartment implements IDepartment {

    //新增一个部门
    public void insert(Department department){
        System.out.println("在SQL Server中给Department表增加一条记录");     
    }

    //获取一个部门信息
    public Department getDepartment(int id){
        System.out.println("在SQL Server中根据部门ID得到Department表一条记录");   
        return null;  
    }
}

User

public class User {

    //用户ID
    private int _id;
    public int getId(){
        return this._id;
    }
    public void setId(int value){
        this._id=value;
    }

    //用户姓名
    private String _name;
    public String getName(){
        return this._name;
    }
    public void setName(String value){
        this._name=value;
    }
    
}

Department

public class Department {

    //部门ID
    private int _id;
    public int getId(){
        return this._id;
    }
    public void setId(int value){
        this._id=value;
    }

    //部门名称
    private String _name;
    public String getName(){
        return this._name;
    }
    public void setName(String value){
        this._name=value;
    }
    
}

Client

public class Client {

	public static void main(String[] args){

		System.out.println("**********************************************");		
		System.out.println("抽象工厂模式");
		System.out.println();		

        User user = new User();
        Department department = new Department();
        
        IFactory factory = new SqlserverFactory();
		//IFactory factory = new AccessFactory();

        IUser iu = factory.createUser();
        iu.insert(user);    //新增一个用户
        iu.getUser(1);      //得到用户ID为1的用户信息

        IDepartment idept = factory.createDepartment();
        idept.insert(department);    //新增一个部门
        idept.getDepartment(2);      //得到部门ID为2的用户信息

		System.out.println();
		System.out.println("**********************************************");
	}
}

输出结果:
在这里插入图片描述

3. 抽象工厂模式的优缺点;

3.1 优点

  • 灵活性和可扩展性:
    • 抽象工厂模式允许系统在不修改现有代码的基础上引入新的产品族,提高了系统的可扩展性。
  • 解耦:
    • 客户端代码与具体工厂实现解耦,降低了模块间的依赖。
  • 一致性:
    • 确保了产品族中的对象是一起创建的,从而保证了对象之间的一致性。

3.2 缺点

  • 系统复杂度增加:
    • 每增加一个新的产品族,都需要增加一个新的具体工厂类和产品类,可能会导致系统中类的数量急剧增加。
  • 难以维护:
    • 随着产品族的增加,抽象工厂模式可能会导致系统结构变得更加复杂,难以理解和维护。
  • 不够灵活:
    • 如果系统需要支持多种产品族的任意组合,抽象工厂模式可能不如其他模式(如建造者模式)灵活。

6. 总结

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

7.参考

  • https://cloud.tencent.com/developer/article/2478362
  • https://blog.csdn.net/m0_46248770/article/details/149914634

网站公告

今日签到

点亮在社区的每一天
去签到