【设计模式】抽象工厂模式--------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分支。
相关文章推荐
- Java 可复用的面向对象的设计模式之 工厂模式Factory详解 :简单工厂模式 工厂方法模式 抽象工厂模式
- JAVA设计模式之抽象工厂模式
- Java设计模式-3-抽象工厂模式
- java设计模式---Abstract Facotry Pattern---抽象工厂模式
- Java设计模式之抽象工厂模式——学习笔记
- JAVA设计模式(三)——抽象工厂模式
- JAVA 设计模式-抽象工厂模式
- JAVA设计模式之抽象工厂模式
- Java设计模式之抽象工厂模式
- java设计模式之抽象工厂模式
- JAVA设计模式(02):创建型-抽象工厂模式(Abstract Factory)
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式+抽象工厂模式)
- Java开发之设计模式--抽象工厂模式(Abstract Factory)
- JAVA设计模式(2) —<创建型>抽象工厂模式(Abstract Factory)
- Java设计模式圣经连载(03)-抽象工厂模式
- 设计模式--创建模式--抽象工厂模式--java
- 【Java设计模式】之抽象工厂模式
- Java开发中的23种设计模式之二:抽象工厂模式(Abstract Factory)
- java设计模式之抽象工厂模式
- Java--设计模式之抽象工厂模式