苏州网站建站,建设地产网站,简单做动画的网站,c 网站开发框架抽象工厂模式#xff08;Abstract Factory Pattern#xff09;#xff0c;又称Kit模式#xff0c;属于对象创建型模式。
一#xff1a;先理解两个概念#xff1a; #xff08;1#xff09;产品等级结构#xff1a; 即产品的继承结构。 通俗来讲#xff0c;就是不同品…抽象工厂模式Abstract Factory Pattern又称Kit模式属于对象创建型模式。
一先理解两个概念 1产品等级结构 即产品的继承结构。 通俗来讲就是不同品牌的同种具体电器
如一个抽象类是电视机类其子类有海尔电视机、海信电视机、TCL电视机等等则抽象电视机与具体产品电视机之间构成了一个产品等级结构。
2产品族 在抽象工厂模式里产品族是指同一个工厂生产的位于不同产品等级结构的一组产品。 通俗来讲就是相同品牌旗下的不同电器产品
如海尔电器工厂生产的的是海尔电视机、海尔空调、海尔冰箱等其中海尔电视机位于电视机产品等级结构中海尔空调位于空调产品等级结构中......
二、模式动机 当系统所提供的工厂所需生产的具体产品并不是一个简单的对象而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。 在工厂方法模式中多个具体工厂有相同的父类接口每一个具体工厂对应一种具体产品但有时候我们需要一个具体工厂可以对应多个产品对象例如生产电器的海尔工厂不会只生产海尔牌电视机它可能还会想要生产海尔牌冰箱海尔牌空调海尔牌电饭煲等。 通俗来讲就是一个工厂有时并不满足于只生产某种品牌的一种具体产品工厂方法模式还想着生产该品牌旗下的其它不同的具体产品抽象方法模式。
三、定义 提供一个创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。
四、模式结构 1.AbstractFactory(抽象工厂) 用于声明抽象产品的方法在一个抽象工厂中可以定义一组方法每一个方法对应一个产品等级结构。
2.ConcreteFactory(具体工厂) 具体工厂实现了抽象工厂声明的生成抽象产品的方法生成一组具体产品这些产品构成了一系列产品族每一个产品都位于某个产品结构中
3.AbstractProduct(抽象产品) 为每种产品声明接口在抽象产品中定义了产品抽象业务方法。
4.ConcreteProduct(具体产品) 具体产品定义具体工厂生产的具体产品对象实现抽象产品接口中定义的业务方法。
五、模式分析 六、模式实例与解析
1.实例说明 某系统为了改进数据库的性能用户可以自定义数据库连接对象Connection和语句对象Statement针对不同的数据库提供不同的连接对象和语句对象例如提供Oracle或MySQL专用连接类和语句类而且用户可以通过配置文件等方式根据实际需求动态更换系统数据库。使用抽象工厂模式设计该系统绘制对应的类图并编程模拟实现。
2.实例类图 3.实例代码
产品区Products包下的类 工厂区Factories包下的类
1AbstractFactory类
package Factories;import Products.ConnectionClass;
import Products.StatementClass;public interface AbstractFactory {public ConnectionClass createConnection();public StatementClass createStatement();
}2MySQLFactoryConcreteFactory
package Factories;import Products.ConnectionClass;
import Products.MConnection;
import Products.MStatement;
import Products.StatementClass;public class MySQLFactory implements AbstractFactory{Overridepublic ConnectionClass createConnection() {return new MConnection();}Overridepublic StatementClass createStatement() {return new MStatement();}
}(3)OracleFactoryConcreteFactory
package Factories;import Products.ConnectionClass;
import Products.OConnection;
import Products.OStatement;
import Products.StatementClass;public class OracleFactory implements AbstractFactory{Overridepublic ConnectionClass createConnection() {return new OConnection();}Overridepublic StatementClass createStatement() {return new OStatement();}
}4.辅助代码
1Client类
package Clients;import Factories.AbstractFactory;
import Products.ConnectionClass;
import Products.StatementClass;public class Client {public static void main(String[] args) {AbstractFactory factory (AbstractFactory) XMLUtil.getBean();ConnectionClass connectionClass factory.createConnection();connectionClass.connectionPlay();StatementClass statementClass factory.createStatement();statementClass.statementPlay();}
}2XMLUtiil类
package Clients;import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil
{//该方法用于从XML配置文件中提取具体类类名并返回一个实例对象public static Object getBean(){try{//创建文档对象DocumentBuilderFactory dFactory DocumentBuilderFactory.newInstance();DocumentBuilder builder dFactory.newDocumentBuilder();Document doc;doc builder.parse(new File(config.xml));//获取包含类名的文本节点NodeList nl doc.getElementsByTagName(className);Node classNodenl.item(0).getFirstChild();String cNameclassNode.getNodeValue();//通过类名生成实例对象并将其返回Class cClass.forName(cName);Object objc.newInstance();return obj;}catch(Exception e){e.printStackTrace();return null;}}
}3配置文件config.xml
?xml version1.0?
configclassNameFactories.MySQLFactory/className
/config
5.实例结果 如果将配置文件config.xml中className里的内容改为Factories.OracleFactory则运行如下 6.实例分析 如果要增加一种新的数据库及增加一个新的产品族如增加DB2的连接对象和DB2的语句对象则只需增加一个具体工厂DB2Factory即可再将配置文件config.xml中具体工厂类类名改为新增的工厂类类名DB2Factory原有其他代码无需修改。 但是如果要新增加一种新的对象例如新增加一种管理对象则原有代码库需要做出较大的修改将导致系统不再符合“开闭原则”。 故抽象工厂模式对“开闭原则”的支持具有特殊性。
七、模式的优点
1、抽象工厂模式隔离了具体类的生成使得用户并不需要知道什么被创建。
2、当一个产品族中的多个对象被设计成一起工作时它能够确保客户端始终只使用同一个产品族中的对象。
3、增加新的具体工厂和产品族很方便无需修改已有系统符合“开闭原则”。
八、模式的缺点 在添加新的产品对象时难以扩展抽象工厂来生产新种类的产品。
九、模式适用环境
1用户无需关心对象的创建过程将对象的创建和使用解耦。
2系统中有多于一个的产品族而每次只使用其中某一产品族。
3属于同一产品族的产品将在一起使用。
4系统提供一个产品类的库所有的产品以同样的接口实现。