您的位置:首页 > 编程语言 > Java开发

【设计模式】抽象工厂模式--------java

2020-04-07 16:41 148 查看

工厂方法模式的问题:一个具体工厂只能创建一类产品。
1.初始代码:

package computer;

import java.util.Scanner;

public class Test {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
User user =new User();
SqlserverUser su=new SqlserverUser();
su.Insert(user);
su.GetUser(1);
}
}

class User{
private int id;
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}

class SqlserverUser{
public void Insert(User user) {
System.out.println("在Sqlserver中给User表增加一条记录。");
}
public User GetUser(int id) {
System.out.println("在Sqlserver中根据ID得到User表的一条记录。");
return null;
}
}

问题:无法更换数据库。

2.2.用工厂方法模式实现:

package computer;

public class Test {
public static void main(String[] args) {
User user=new User();
//要修改数据库时,只需要修改这一句:
IFactory factory=new SqlserverFactory();

IUser iu=factory.CreateUser();
iu.Insert(user);
iu.GetUser(1);
}
}

class User{
private int id;
private String name;
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
}

interface IUser{
void Insert(User user);
User GetUser(int id);
}

class SqlserverUser implements IUser{
public void Insert(User user) {
System.out.println("在Sqlserver中给User表增加一条记录。");
}
public User GetUser(int id) {
System.out.println("在Sqlserver中根据ID得到User表的一条记录。");
return null;
}
}

class AccessUser implements IUser{
public void Insert(User user) {
System.out.println("在Access中给User表增加一条记录。");
}
public User GetUser(int id) {
System.out.println("在Access中根据ID得到User表的一条记录。");
return null;
}
}

interface IFactory{
IUser CreateUser();
}

class SqlserverFactory implements IFactory{
public IUser CreateUser() {
return new SqlserverUser();
}
}

class AccessFactory implements IFactory{
public IUser CreateUser() {
return new AccessUser();
}
}

工厂方法模式的问题:一个具体工厂只能创建一类产品。

3.当有多个表时的抽象工厂模式:

package computer;

public class Test {
public static void main(String[] args) {
User user = new User();
Department dept=new Department();
//修改数据库时,只需要修改这一句:
IFactory factory = new SqlserverFactory();

IUser iu = factory.CreateUser();
iu.Insert(user);
iu.GetUser(1);

IDepartment id=factory.createDepartment();
id.Insert(dept);
id.GetDepartment(1);
}
}

class User {
private int id;
private String name;

public int getId() {
return id;
}

public String getName() {
return name;
}

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

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

interface IUser {
void Insert(User user);

User GetUser(int id);
}

class SqlserverUser implements IUser {
public void Insert(User user) {
System.out.println("在Sqlserver中给User表增加一条记录。");
}

public User GetUser(int id) {
System.out.println("在Sqlserver中根据ID得到User表的一条记录。");
return null;
}
}

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

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

class Department {
private int id;
private String DeptName;

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

public void setDeptName(String deptName) {
DeptName = deptName;
}

public int getId() {
return id;
}

public String getDeptName() {
return DeptName;
}
}

interface IDepartment {
void Insert(Department department);
Department GetDepartment(int id);
}

class SqlserverDepartment implements IDepartment{
public void Insert(Department department) {
System.out.println("在Sqlserver中给Department表增加一条记录。");
}
public Department GetDepartment(int id) {
System.out.println("在Sqlserver中根据ID得到Department表的一条记录。");
return null;
}
}

class AccessDepartment implements IDepartment{
public void Insert(Department department) {
System.out.println("在Access中给Department表增加一条记录。");
}
public Department GetDepartment(int id) {
System.out.println("在Access中根据ID得到Department表的一条记录。");
return null;
}
}

interface IFactory {
IUser CreateUser();
IDepartment createDepartment();
}

class SqlserverFactory implements IFactory {
public IUser CreateUser() {
return new SqlserverUser();
}
public IDepartment createDepartment() {
return new SqlserverDepartment();
}
}

class AccessFactory implements IFactory {
public IUser CreateUser() {
return new AccessUser();
}
public IDepartment createDepartment() {
return new AccessDepartment();
}
}

缺点:客户端程序类不止一个,若有一百个调用数据库访问的类修改数据库,就要修改100次IFactory factory=new AccessFactory()代码。不能做到更改数据库时,改动一处就完全更改的要求。

4.用简单工厂来改进抽象工厂
(去除IFactory、SqlserverFactory、AccessFactory三个工厂类,用DataAccess类代替)

package computer;

public class Test {
public static void main(String[] args) {
//客户端不需要修改
User user=new User();
Department dept=new Department();

IUser iu=DataAccess.CreateUser();
iu.Insert(user);
iu.GetUser(1);

IDepartment id=DataAccess.CreateDepartment();
id.Insert(dept);
id.GetDepartment(1);
}
}

class User {
private int id;
private String name;

public int getId() {
return id;
}

public String getName() {
return name;
}

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

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

interface IUser {
void Insert(User user);

User GetUser(int id);
}

class SqlserverUser implements IUser {
public void Insert(User user) {
System.out.println("在Sqlserver中给User表增加一条记录。");
}

public User GetUser(int id) {
System.out.println("在Sqlserver中根据ID得到User表的一条记录。");
return null;
}
}

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

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

class Department {
private int id;
private String DeptName;

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

public void setDeptName(String deptName) {
DeptName = deptName;
}

public int getId() {
return id;
}

public String getDeptName() {
return DeptName;
}
}

interface IDepartment {
void Insert(Department department);
Department GetDepartment(int id);
}

class SqlserverDepartment implements IDepartment{
public void Insert(Department department) {
System.out.println("在Sqlserver中给Department表增加一条记录。");
}
public Department GetDepartment(int id) {
System.out.println("在Sqlserver中根据ID得到Department表的一条记录。");
return null;
}
}

class AccessDepartment implements IDepartment{
public void Insert(Department department) {
System.out.println("在Access中给Department表增加一条记录。");
}
public Department GetDepartment(int id) {
System.out.println("在Access中根据ID得到Department表的一条记录。");
return null;
}
}

class DataAccess{
private static String db="Sqlserver";
//修改数据库时只需更改这句话:
//private static readonly String db="Access";

public static IUser CreateUser() {
IUser iu=null;
switch(db) {
case "Sqlserver":
iu=new SqlserverUser();
break;
case"Access":
iu=new AccessUser();
break;
}
return iu;
}
public static IDepartment CreateDepartment() {
IDepartment id=null;
switch(db) {
case "Sqlserver":
id=new SqlserverDepartment();
break;
case"Access":
id=new AccessDepartment();
break;
}
return id;
}
}

缺点:增加数据库时,原本抽象工厂只需增加一个OracleFactory类,现在还要在DataAccess类的每个方法中增加switch分支。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: