本文共 4583 字,大约阅读时间需要 15 分钟。
抽象工厂模式是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
抽象工厂模式的缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。增加了系统的抽象性和理解难度。
抽象工厂模式的主要角色如下:
抽象工厂模式结构如下图所示:
模式的实现:
(1) 抽象工厂:提供了产品的生成方法。
interface AbstractFactory { public Product1 newProduct1(); public Product2 newProduct2(); }
(2) 具体工厂:实现了产品的生成方法。
class ConcreteFactory1 implements AbstractFactory { public Product1 newProduct1() { System.out.println("具体工厂 1 生成-->具体产品 11..."); return new ConcreteProduct11(); } public Product2 newProduct2() { System.out.println("具体工厂 1 生成-->具体产品 21..."); return new ConcreteProduct21(); } }
下图为抽象工厂模式具体应用的UML图:
IUser接口,用于客户端访问,解除与具体数据库访问的耦合。
public interface IUser { void insert(User user); User getUser(int id);}
SqlServerUser类,用于访问SQL Server的User。
public class SqlServerUser implements IUser { @Override public void insert(User user) { System.out.println("在SQL Server中给User表增加一条记录"); } @Override public User getUser(int id) { System.out.println("在SQL Server中根据ID得到User表一条记录"); return null; }}
AccessUser类,用于访问Access的User。
public class AccessUser implements IUser { @Override public void insert(User user) { System.out.println("在Access中给User表增加一条记录"); } @Override public User getUser(int id) { System.out.println("在Access中根据ID得到User表一条记录"); return null; }}
IDepartment接口,用于客户端访问,解除与具体数据库访问的耦合。
public interface IDepartment { void insert(Department department); Department getDepartment(int id);}
SqlServerDepartment类,用于访问SQL Server的Department。
public class SqlServerDepartment implements IDepartment { @Override public void insert(Department department) { System.out.println("在SQL Server中给Department表增加一条记录"); } @Override public Department getDepartment(int id) { System.out.println("在SQL Server中根据ID得到Department表一条记录"); return null; }}
AccessDepartment类,用于访问Access的Department。
public class AccessDepartment implements IDepartment { @Override public void insert(Department department) { System.out.println("在Access中给Department表增加一条记录"); } @Override public Department getDepartment(int id) { System.out.println("在Access中根据ID得到Department表一条记录"); return null; }}
IFactory接口,定义一个创建访问User和Department表对象的抽象的工厂接口。
public interface IFactory { IUser createUser(); IDepartment createDepartment();}
SqlServerFactory类,实现IFactory接口,实例化SqlServerUser和SqlServerDepartment。
public class SqlServerFactory implements IFactory { @Override public IUser createUser() { return new SqlServerUser(); } @Override public IDepartment createDepartment() { return new SqlServerDepartment(); }}
AccessFactory类,实现IFactory接口,实例化AccessUser和AccessDepartment。
public class AccessFactory implements IFactory { @Override public IUser createUser() { return new AccessUser(); } @Override public IDepartment createDepartment() { return new AccessDepartment(); }}
客户端代码
public class Main { public static void main(String[] args) { User user = new User(); Department department = new Department();// IFactory factory = new SqlServerFactory(); IFactory factory = new AccessFactory(); IUser iu = factory.createUser(); iu.insert(user); iu.getUser(1); IDepartment id = factory.createDepartment(); id.insert(department); id.getDepartment(1); }}
结果显示如下:
抽象工厂模式最早的应用是用于创建属于不同操作系统的视窗构件。如 Java 的 AWT 中的 Button 和 Text 等构件在 Windows 和 UNIX 中的本地实现是不同的。
抽象工厂模式通常适用于以下场景:
转载地址:http://mmoe.baihongyu.com/