设计模式——抽象工厂模式
2017-03-03 19:57
567 查看
抽象工厂模式是工厂方法模式的泛化版,工厂方法模式是一种特殊的抽象工厂模式。
抽象工厂模式包含以下角色:
1、抽象工厂
抽象工厂声明生成抽象产品的一组方法,每一个方法对应一个产品等级。
2、具体工厂
实现了抽象工厂声明的方法,生成具体产品,每一个产品都位于某个产品等级结构中。
3、抽象产品
抽象产品为具体产品声明
4、具体产品
定义具体工厂生产的具体产品对象,实现抽象产品
1、隔离了具体类的生成,并且实现高内聚低耦合的设计目的。
2、增加新的具体工厂和产品很方便,无需修改已有系统,符合“开闭原则”。
缺点:
添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品。
因为在抽象工厂中规定了所有可能被创建的产品集合,要支持新种类的产品意味着要对该接口进行扩展,而这将涉及对抽象工厂及其所有子类的修改,有很大的不便。
2、产品中有多于一个产品族,而每次只使用其中某一个产品族。。
3、属于同一个产品族的产品将在一起使用。
4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
又是一个栗子
某系统为了改进数据库操作的性能,自定义数据库连接对象Connection和语句对象Statement,可针对不同类型的数据库提供不同的连接对象和语句对象
分类,抽象产品类Connection、Statement,具体产品类OracleConnection、MySQLConnection、OracleStatement、MySQLStatement,抽象工厂类DBFactory,具体工厂类OracleFactory、MySQLFactory。
Statement 类
MySQLConnection 类
OracleConnection 类
OracleStatement 类
MySQLStatement 类
DBFactory 类
MySQLFactory 类
OracleFactory类
XMLUtils类
Client类
抽象工厂模式包含以下角色:
1、抽象工厂
抽象工厂声明生成抽象产品的一组方法,每一个方法对应一个产品等级。
2、具体工厂
实现了抽象工厂声明的方法,生成具体产品,每一个产品都位于某个产品等级结构中。
3、抽象产品
抽象产品为具体产品声明
接口,定义了产品的抽象业务方法。
4、具体产品
定义具体工厂生产的具体产品对象,实现抽象产品
接口定义的业务方法。
优缺点
优点:1、隔离了具体类的生成,并且实现高内聚低耦合的设计目的。
2、增加新的具体工厂和产品很方便,无需修改已有系统,符合“开闭原则”。
缺点:
添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品。
因为在抽象工厂中规定了所有可能被创建的产品集合,要支持新种类的产品意味着要对该接口进行扩展,而这将涉及对抽象工厂及其所有子类的修改,有很大的不便。
模式适用环境
1、用户无需关心对象的创建过程,对象的创建和使用解耦。2、产品中有多于一个产品族,而每次只使用其中某一个产品族。。
3、属于同一个产品族的产品将在一起使用。
4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
又是一个栗子
某系统为了改进数据库操作的性能,自定义数据库连接对象Connection和语句对象Statement,可针对不同类型的数据库提供不同的连接对象和语句对象
分类,抽象产品类Connection、Statement,具体产品类OracleConnection、MySQLConnection、OracleStatement、MySQLStatement,抽象工厂类DBFactory,具体工厂类OracleFactory、MySQLFactory。
详细代码
Connection类public interface Connection { }
Statement 类
public interface Statement { }
MySQLConnection 类
public class MySQLConnection implements Connection { }
OracleConnection 类
public class OracleConnection implements Connection { }
OracleStatement 类
public class OracleStatement implements Statement { }
MySQLStatement 类
public class MySQLStatement implements Statement { }
DBFactory 类
public interface DBFactory { Connection createConnection(); Statement createStatement(); }
MySQLFactory 类
public class MySQLFactory implements DBFactory { @Override public Connection createConnection() { return new MySQLConnection(); } @Override public Statement createStatement() { return new MySQLStatement(); } }
OracleFactory类
public class OracleFactory implements DBFactory { @Override public Connection createConnection() { return new OracleConnection(); } @Override public Statement createStatement() { return new OracleStatement(); } }
XMLUtils类
public class XMLUtils { public static String getClassName() { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new File("src/config.xml")); Node classNode = doc.getElementsByTagName("class").item(0).getFirstChild(); String type = classNode.getNodeValue().trim(); return type; } catch (Exception e) { System.out.println(e.getMessage()); } return null; } }
Client类
public class Client { public static void main(String[] args) { try { Class<?> c = Class.forName(XMLUtils.getClassName()); DBFactory factory = (DBFactory) c.newInstance(); System.out.println(factory.createConnection().getClass().toString()); System.out.println(factory.createStatement().getClass().toString()); } catch (ClassNotFoundException e) { System.out.println("can not find class!"); } catch (Exception e) { System.out.println(e.getMessage()); } } }
以上就是笔者关于抽象工厂模式的分析与实例展示。
如有错误,欢迎指出。
相关文章推荐
- 设计模式C#描述——抽象工厂模式
- .NET设计模式-抽象工厂模式(Abstract Factory)
- 设计模式C#描述——抽象工厂模式
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
- 设计模式——创建型模式之 Abstract Factory抽象工厂模式
- [导入]C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)
- 设计模式C#描述——抽象工厂模式
- Java设计模式圣经连载(03)-抽象工厂模式
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
- 我的设计模式之旅(3)――抽象工厂模式AbstractFactory
- 设计模式实践(抽象工厂模式应用)—通信录的优化过程
- 设计模式之抽象工厂模式
- AspectJ实现设计模式(四)——抽象工厂模式
- .NET设计模式:抽象工厂模式(Abstract Factory)
- [导入]C#面向对象设计模式纵横谈(4):Abstract Factory 抽象工厂模式(创建型模式)
- 设计模式笔记-抽象工厂模式
- .Net设计模式之抽象工厂模式(Abstract Factory)
- .NET设计模式(3):抽象工厂模式(Abstract Factory)(转)
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
- 设计模式(3)-抽象工厂模式(Abstract Factory)