代码改变世界

设计模式——抽象工厂模式(AbstractFactoryPattern)

  雪夜&流星  阅读(260)  评论(0编辑  收藏  举报

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

UML图:

IFactory:

package com.cnblog.clarck;

public interface IFactory {
    IUser createUser();
    
    IDepartment createDepartment();
}

SqlserverFactory:

复制代码
package com.cnblog.clarck;

public class SqlserverFactory implements IFactory {

    @Override
    public IUser createUser() {
        return new SqlserverUser();
    }

    @Override
    public IDepartment createDepartment() {
        return new SqlserverDepartment();
    }

}
复制代码
AccessFactory:
复制代码
package com.cnblog.clarck;

public class AccessFactory implements IFactory {

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

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

}
复制代码

IUser:

package com.cnblog.clarck;

public interface IUser {
    void insert(User user);
    
    User getUser(int id);
}

AccessUser:

复制代码
package com.cnblog.clarck;

public class AccessUser implements IUser {
    
    @Override
    public void insert(User user) {
        System.out.println("在Access中给User表增加一条记录");
    }

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

}
复制代码

SqlserverUser:

复制代码
package com.cnblog.clarck;

public class SqlserverUser implements IUser {

    @Override
    public void insert(User user) {
        System.out.println("在SQL Server中给User表增加一条记录");
    }

    @Override
    public User getUser(int id) {
        System.out.println("在SQL Server中根据ID得到User表一条记录");
        return null;
    }
}
复制代码

IDepartment:

复制代码
package com.cnblog.clarck;

/**
 * IDepartment 接口,用于客户端访问,解除与具体数据库访问的耦合
 * 
 * @author clarck
 * 
 */
public interface IDepartment {
    public void insert(Department department);

    public Department getDepartment(int id);
}
复制代码

AccessDepartment:

复制代码
package com.cnblog.clarck;

public class AccessDepartment implements IDepartment {

    @Override
    public void insert(Department department) {
        System.out.println("在Access中给Department表增加一条记录");
    }

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

}
复制代码

SqlserverDepartment:

复制代码
package com.cnblog.clarck;

public class SqlserverDepartment implements IDepartment {
    
    @Override
    public void insert(Department department) {
        System.out.println("在SQL Server中给Department表添加一条记录");
    }

    @Override
    public Department getDepartment(int id) {
        System.out.println("在SQL Server中根据ID得到Department表的一条记录");
        return null;
    }

}
复制代码

Department:

复制代码
package com.cnblog.clarck;

public class Department {
    private int mID;
    private String mDeptName;

    public int getID() {
        return mID;
    }

    public void setID(int mID) {
        this.mID = mID;
    }

    public String getDeptName() {
        return mDeptName;
    }

    public void setDeptName(String mDeptName) {
        this.mDeptName = mDeptName;
    }

}
复制代码

User:

复制代码
package com.cnblog.clarck;

public class User {
    private int mID;
    private String mName;

    public int getID() {
        return mID;
    }

    public void setID(int mID) {
        this.mID = mID;
    }

    public String getName() {
        return mName;
    }

    public void setName(String mName) {
        this.mName = mName;
    }

}
复制代码

 Client:

复制代码
package com.cnblog.clarck;

public class Client {
    public static void main(String[] args) {
        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);
        
        IDepartment iDepartment = factory.createDepartment();
        iDepartment.insert(department);
        iDepartment.getDepartment(1);
    }
}
复制代码

 

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示