深入理解设计模式-抽象工厂模式

Posted Xd聊架构

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解设计模式-抽象工厂模式相关的知识,希望对你有一定的参考价值。

文章目录


一、定义

抽象工厂模式隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象


二、使用场景

  • 系统中有多个产品系列,但每次只使用其中的某一系列产品。
  • 属于同一个产品系列的对象将在一起使用, 同一个产品系列中的对象可以是没有任何关系的对象, 但是它们都具有一些共同的约束

三、代码样例

1.需求

Access数据库中存在User和Department表的CRUD,现需更换DB到SqlServer数据库,提供方便快捷的更换方式

2.类图

3.实体类


/**
 * 用户实体类
 */
public class User 
    private long id;
    private String name;

    public long getId() 
        return id;
    

    public void setId(long id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

/**
 * 部门实体类
 */
public class Department 
    private long id;
    private String deptName;
    public long getId() 
        return id;
    
    public void setId(long id) 
        this.id = id;
    
    public String getDeptName() 
        return deptName;
    
    public void setDeptName(String deptName) 
        this.deptName = deptName;
    


4.产品类

/**
 * 用户访问接口
 */
public interface IUser 
    //对数据库操作采取插入和查询(通过ID)
    void insert(User user);

    void getUser(int id);


class SqlServerUser implements IUser 

    @Override
    public void insert(User user) 
        System.out.println("在SqlServer数据库插入user记录");
    

    @Override
    public void getUser(int id) 
        System.out.println("在SqlServer数据库根据id获取user记录");
    



class AccessUser implements IUser 

    @Override
    public void insert(User user) 
        System.out.println("在Access数据库插入user记录");
    

    @Override
    public void getUser(int id) 
        System.out.println("在Access数据库根据id获取user记录");
    


/**
 * 部门访问接口
 */
public interface IDepartment 
    void insert(Department dept);

    void getDept(int id);


class AccessDepartment implements IDepartment 
    @Override
    public void insert(Department dept) 
        System.out.println("在Access数据库插入department记录");
    

    @Override
    public void getDept(int id) 
        System.out.println("在Access数据库根据id获取department记录");
    


class SqlServerDepartment implements IDepartment 
    @Override
    public void insert(Department dept) 
        System.out.println("在SqlServer数据库插入department记录");
    

    @Override
    public void getDept(int id) 
        System.out.println("在SqlServer数据库根据id获取department记录");
    

5.工厂类

/**
 * 抽象工厂
 */
public interface IFactory 
    IUser createUser();

    IDepartment createDepartment();


class SqlServerFactory implements IFactory 
    @Override
    public IUser createUser() 
        return new SqlServerUser();
    

    @Override
    public IDepartment createDepartment() 
        return new SqlServerDepartment();
    


class AccessFacotry implements IFactory 

    @Override
    public IUser createUser() 
        return new AccessUser();
    

    @Override
    public IDepartment createDepartment() 
        return new AccessDepartment();
    

6.客户端

/**
 * 客户端
 */
public class Client 
    public static void main(String[] args) 
        User user = new User();
        Department dept = new Department();
        //IFactory factory = new AccessFacotry();
        IFactory factory = new SqlServerFactory();

        IUser iu = factory.createUser();
        iu.insert(user);
        iu.getUser(1);

        IDepartment idept = factory.createDepartment();
        idept.insert(dept);
        idept.getDept(1);
    



四、优缺点

优点:

  • 1、易于更换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同产品配置。

  • 2、它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操作实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。

缺点:

  • 1.新增产品系列不方便
    如果要增加一个项目表Project,那么就需要增加三个类,IProject,AccessProject,SqlServerProject,还需要改动IFactory,AccessFactory,SqlServerFactory才可以完全实现。这样是很糟糕的。

结尾

  • 感谢大家的耐心阅读,如有建议请私信或评论留言。
  • 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步

以上是关于深入理解设计模式-抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-抽象工厂

抽象工厂模式

设计模式-简单工厂工厂方法模式抽象工厂模式详解

抽象 工厂模式

JAVA设计模式——抽象工厂模式案例实现

深入理解设计模式:抽象工厂模式