概述
一、工厂方法实现
/**
* 对应数据库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);
}
}
-
工厂方法模式:
- 一个抽象产品类,可以派生出多个具体产品类。
- 一个抽象工厂类,可以派生出多个具体工厂类。
- 每个具体工厂类只能创建一个具体产品类的实例。
-
抽象工厂模式:
- 多个抽象产品类,每个抽象产品类可以派生出多个具体产品
类。 - 一个抽象工厂类,可以派生出多个具体工厂类。
- 每个具体工厂类可以创建多个具体产品类的实例。
-
区别:
- 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
- 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,
而抽象工厂模式可以创建多个
最后
以上就是耍酷乌冬面为你收集整理的大话设计模式-抽象工厂模式一、工厂方法实现二、抽象工厂实现三、简单工厂实现的全部内容,希望文章能够帮你解决大话设计模式-抽象工厂模式一、工厂方法实现二、抽象工厂实现三、简单工厂实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复