我是靠谱客的博主 耍酷乌冬面,最近开发中收集的这篇文章主要介绍大话设计模式-抽象工厂模式一、工厂方法实现二、抽象工厂实现三、简单工厂实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、工厂方法实现

在这里插入图片描述

/**
 * 对应数据库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. 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,
    而抽象工厂模式可以创建多个

最后

以上就是耍酷乌冬面为你收集整理的大话设计模式-抽象工厂模式一、工厂方法实现二、抽象工厂实现三、简单工厂实现的全部内容,希望文章能够帮你解决大话设计模式-抽象工厂模式一、工厂方法实现二、抽象工厂实现三、简单工厂实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部