大话设计模式-抽象工厂模式

一、工厂方法实现

/** * 对应数据库User表的实体类 */
public class User {
    private int id;
    private String name;

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public User() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

1.两种不同的数据库 各自有各自的操作语句

/** * 数据表User操作接口 */
public interface IUser {
    void insert(User user);

    void getUser(int id);
}
/** * 使用SQLServer数据库操作User表 */
public class SqlServerUser implements IUser {
    @Override
    public void insert(User user) {
        System.out.println("SQLServer --> INSERT INTO user( id , name ) VALUES( " + user.getId() + " , " + user.getName() + " )");
    }

    @Override
    public void getUser(int id) {
        System.out.println("SQLServer --> SELECT * FROM user WHERE ID = " + id);
    }
}
/** * 使用Access数据库操作User表 */
public class AccessUser implements IUser {
    @Override
    public void insert(User user) {
        System.out.println("Access --> INSERT INTO user( id , name ) VALUES( " + user.getId() + " , " + user.getName() + " )");
    }

    @Override
    public void getUser(int id) {
        System.out.println("Access --> SELECT * FROM user WHERE ID = " + id);
    }
}

2.两种不同的工厂 用来生成不同的数据库操作实例

/** * 工厂方法接口 */
public interface IFactory {
    //生成一个User工厂
    IUser creteUser();
}
/** * SqlServer工厂 */
public class SqlServerFactory implements IFactory {
    @Override
    public IUser creteUser() {
        return new SqlServerUser();
    }
}
/*** * Access工厂 */
public class AccessFactory implements IFactory {
    @Override
    public IUser creteUser() {
        return new AccessUser();
    }
}

测试

public class Main {
    public static void main(String[] args) {
        /** * 使用工厂方法 * 更改生成的工厂类别即可更换数据库 */
        User user = new User(1, "大神");
        IFactory factory = new SqlServerFactory();
// IFactory factory = new AccessFactory();
        IUser iUser = factory.creteUser();
        iUser.insert(user);
        iUser.getUser(1);
    }
}

二、抽象工厂实现

在上面的工厂方法的基础上 添加部门实体类 此时要增加对该表的不同数据库的操作

/** * 对应数据库Department表的实体类 */
public class Department {
    private int id;
    private String name;

    public Department() {
    }

    public Department(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

1.两种不同的数据库 各自有各自的操作语句

public interface IDepartment {
    void insert(Department department);

    void getDepartment(int id);
}
public class SqlServerDepartment implements IDepartment {
    @Override
    public void insert(Department department) {
        System.out.println("SQLServer --> INSERT INTO department( id , name ) VALUES( " + department.getId() + " , " + department.getName() + " )");
    }

    @Override
    public void getDepartment(int id) {
        System.out.println("SQLServer --> SELECT * FROM department WHERE ID = " + id);
    }
}
public class AccessDepartment implements IDepartment {
    @Override
    public void insert(Department department) {
        System.out.println("Access --> INSERT INTO department( id , name ) VALUES( " + department.getId() + " , " + department.getName() + " )");
    }

    @Override
    public void getDepartment(int id) {
        System.out.println("Access --> SELECT * FROM department WHERE ID = " + id);
    }
}

2.在两种不同的工厂里添加对Department的生成方法

/** * 工厂方法接口 */
public interface IFactory {
    //生成一个User工厂
    IUser creteUser();

    //生成一个Department工厂
    IDepartment creteDepartment();
}
/** * SqlServer工厂 */
public class SqlServerFactory implements IFactory {
    @Override
    public IUser creteUser() {
        return new SqlServerUser();
    }

    @Override
    public IDepartment creteDepartment() {
        return new SqlServerDepartment();
    }
}
/*** * Access工厂 */
public class AccessFactory implements IFactory {
    @Override
    public IUser creteUser() {
        return new AccessUser();
    }

    @Override
    public IDepartment creteDepartment() {
        return new AccessDepartment();
    }
}
public class Main {
    public static void main(String[] args) {
        /** * 使用抽象工厂模式 * 更改生成的工厂类别即可更换数据库 */
        User user = new User(1, "小菜");
// IFactory factory = new SqlServerFactory();
        IFactory factory = new AccessFactory();
        IUser iUser = factory.creteUser();
        iUser.insert(user);
        iUser.getUser(1);

        Department department = new Department(1, "宣传部");
        IDepartment iDepartment = factory.creteDepartment();
        iDepartment.insert(department);
        iDepartment.getDepartment(1);
    }
}

三、简单工厂实现

1.去除IFactory、SqlServerFactory、AccessFactory,代替的是DataBase

public interface DataBase {
    public static final String DB = "SQLServer";

    //public static final String DB = "Access";
    public static IUser createUser() {
        IUser iUser = null;
        switch (DB) {
            case "SQLServer":
                iUser = new SqlServerUser();
                break;
            case "Access":
                iUser = new AccessUser();
                break;
            default:
                break;
        }
        return iUser;
    }

    public static IDepartment createDepartment() {
        IDepartment iDepartment = null;
        switch (DB) {
            case "SQLServer":
                iDepartment =  new SqlServerDepartment();
                break;
            case "Access":
                iDepartment =  new AccessDepartment();
                break;
            default:
                break;
        }
        return iDepartment;
    }
}

2.其余不变,测试类:

public class Main {
    public static void main(String[] args) {
        User user = new User(1, "大神");
        IUser iUser = DataBase.createUser();
        iUser.insert(user);
        iUser.getUser(1);

        Department department = new Department(1, "宣传部");
        IDepartment iDepartment = DataBase.createDepartment();
        iDepartment.insert(department);
        iDepartment.getDepartment(1);
    }
}
  • 工厂方法模式:
  1. 一个抽象产品类,可以派生出多个具体产品类。
  2. 一个抽象工厂类,可以派生出多个具体工厂类。
  3. 每个具体工厂类只能创建一个具体产品类的实例。
  • 抽象工厂模式:
  1. 多个抽象产品类,每个抽象产品类可以派生出多个具体产品
    类。
  2. 一个抽象工厂类,可以派生出多个具体工厂类。
  3. 每个具体工厂类可以创建多个具体产品类的实例。
  • 区别:
  1. 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
  2. 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,
    而抽象工厂模式可以创建多个
全部评论

相关推荐

2025-12-19 21:53
门头沟学院 Java
想做OpenGL:不要一来就把自己定位这么低吧,把大厂当成目标,不断去学技术做项目,最后你至少能学到能找到中小厂的技术水平,你一上来就找这种两千块还要前后端都会的,其实对你用处不会很大,真去了也是打杂
点赞 评论 收藏
分享
01-14 10:23
已编辑
湖南师范大学 计调
太久没更新,前几天看到一条评论,说“牛客就是当年那群做题区毕业了开始找工作还收不住那股味”的群体。字里行间透着居高临下的评判,不是,他该不会以为自己很幽默?很犀利吧?作为在牛客混了不算短日子的用户,我感到的不只是被冒犯,更是一种深刻的悲哀——这种以“松弛感”为名,对另一种生存策略的轻蔑,颇有一种自己考不上大学早早出来混社会,嘲笑考上大学的人是书呆子,然后大言不惭地说:死读书有什么用,人脉和资源才是硬道理。我不知道说这个话的人,手头究竟握着多少真正管用的人脉与资源,也不知道他这么傲慢地说出“那股味”的时候,是站在哪一个巨人的肩膀上,才能如此“松弛从容”地俯视众生,还能品评出别人身上“没收住”的余...
淬月星辉:这种评论把正常的努力扭曲成卷😂,说白了就是自己不努力,看着身边努力的人一个个都事业有成了,自己的心里开始不平衡了,就发这种酸言酸语。牛客可以说是我用过那么多平台里社区氛围最好的论坛了,用了大半年了,基本上没见过有人吵架的,都是在互帮互助提建议,帮忙看简历的,帮忙选offer的,帮忙指点学习路线的,分享工作经验和趣事的,我觉得这才是互联网该有的样子。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务