产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,例如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
抽象工厂模式包含如下角色:
AbstractFactory:抽象工厂
ConcreteFactory:具体工厂
AbstractProduct:抽象产品
ConcreteProduct:具体产品
新建抽象产品类电视
package abstractfactory;
public interface Television {
public void play();
}
新增具体产品类
package abstractfactory;
public class HaierTelevision implements Television{
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("海尔电视机播放中。。。。。");
}
}
package abstractfactory;
public class TCLTelevision implements Television{
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println();
}
}
新建抽象产品类空调
package abstractfactory;
public interface AirConditioner {
public void changeTemperature();
}
新增具体产品空调
package abstractfactory;
public class HaierAirConditioner implements AirConditioner{
@Override
public void changeTemperature() {
// TODO Auto-generated method stub
System.out.println("海尔空调温度改变中。。。。。");
}
}
package abstractfactory;
public class TCLAirConditioner implements AirConditioner{
@Override
public void changeTemperature() {
// TODO Auto-generated method stub
System.out.println("TCL空调温度改变中。。。。");
}
}
新增抽象工厂类
package abstractfactory;
public interface EFactory {
public Television produceTelevision();
public AirConditioner produceAirConditioner();
}
新增具体工厂类
package abstractfactory;
public class HaierFactory implements EFactory{
public Television produceTelevision() {
return new HaierTelevision();
}
@Override
public AirConditioner produceAirConditioner() {
// TODO Auto-generated method stub
return new HaierAirConditioner();
}
}
package abstractfactory;
public class TCLFactory implements EFactory{
@Override
public Television produceTelevision() {
// TODO Auto-generated method stub
return new TCLTelevision();
}
@Override
public AirConditioner produceAirConditioner() {
// TODO Auto-generated method stub
return new TCLAirConditioner();
}
}
控制台程序
package abstractfactory;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
EFactory factory; //新建抽象工厂
Television tv; //新建抽象产品电视
AirConditioner ac; //新建抽象产品空调
factory=(EFactory)XMLUtil.getBean(); //确定具体工厂
tv=factory.produceTelevision(); //新建电视
tv.play(); //播放电视
ac=factory.produceAirConditioner();//新建空调
ac.changeTemperature();//调用空调内函数
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
XMLUtil类
package abstractfactory;
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("AbstractFactoryconfig.xml"));
//获取包含类名的文本节点
NodeList nl = doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue();
//通过类名生成实例对象并将其返回
Class c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
}
xml文件建立一个海尔工厂
<?xml version="1.0"?>
<config>
<className>abstractfactory.HaierFactory</className>
</config>