设计模式-抽象工厂模式实例-01
要点:
需要一个工厂生产多个产品对象。
优点:
隔离了具体类的生成,使客户端不知道什么被创建;
保证客户端始终只使用一个产品族的对象;
增加新的产品族很方便,符合开闭原则。
缺点:
增加新的产品等级结构很复杂,不符合开闭原则。
适用环境:
一个系统不应当依赖于产品类的实例如何被创建、组合和表达的细节;
系统中有多个产品族但每次只使用其中某一产品族;
属于同一个产品族的产品将在一起被使用;
产品等级结构稳定。
静态工厂模式、工厂方法模式、抽象工厂模式对比:
实例1:海尔工厂和TCL工厂生产电视和空调。
类图
代码实现:
代码结构:
factory:
EFactory.java:
import abstractTVFactory.airConditioner.AirConditioner;
import abstractTVFactory.television.Television;
//抽象工厂类
public interface EFactory {
public Television produceTelevision();
public AirConditioner produceAirConditioner();
}
HaierFactory.java:
import abstractTVFactory.airConditioner.AirConditioner;
import abstractTVFactory.airConditioner.HaierAirConditioner;
import abstractTVFactory.television.HaierTelevision;
import abstractTVFactory.television.Television;
//具体工厂类HaierFactory
public class HaierFactory implements EFactory {
public Television produceTelevision(){
return new HaierTelevision();
}
public AirConditioner produceAirConditioner(){
return new HaierAirConditioner();
}
}
TCLFactory.java:
import abstractTVFactory.airConditioner.AirConditioner;
import abstractTVFactory.airConditioner.TCLAirConditioner;
import abstractTVFactory.television.TCLTelevision;
import abstractTVFactory.television.Television;
//具体工厂类TCLFactory
public class TCLFactory implements EFactory {
public Television produceTelevision(){
return new TCLTelevision();
}
public AirConditioner produceAirConditioner(){
return new TCLAirConditioner();
}
}
television:
Television.java:
//抽象产品类
public interface Television {
public void play();
}
HaierTelevision.java:
//具体产品类HaierTV
public class HaierTelevision implements Television {
public void play(){
System.out.println("Haier TV is playing");
}
}
TCLTelevision.java:
//具体产品类TCLTV
public class TCLTelevision implements Television {
public void play(){
System.out.println("TCL TV is playing");
}
}
airConditioner:
AirConditioner.java:
//抽象工厂类AirConditioner
public interface AirConditioner {
public void use();
}
HaierAirConditioner.java:
//具体产品类Haier空调
public class HaierAirConditioner implements AirConditioner {
public void use(){
System.out.println("Haier AirConditioner is using");
}
}
TCLAirConditioner.java:
//具体产品类TCL空调
public class TCLAirConditioner implements AirConditioner {
public void use(){
System.out.println("TCL AirConditioner is using");
}
}
utils:
XMLUtil.java:
import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil {
public static Object getBean(){
try {
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("src/abstractTVFactory/utils/config.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;
}
}
}
config.xml:
<?xml version="1.0" ?>
<config>
<className>abstractTVFactory.factory.TCLFactory</className>
</config>
Client:
Client.java:
import abstractTVFactory.airConditioner.AirConditioner;
import abstractTVFactory.factory.EFactory;
import abstractTVFactory.television.Television;
import abstractTVFactory.utils.XMLUtil;
public class Client {
public static void main(String[] args) {
try{
EFactory factory;
Television tv;
AirConditioner airConditioner;
factory = (EFactory) XMLUtil.getBean();
tv = factory.produceTelevision();
tv.play();
airConditioner = factory.produceAirConditioner();
airConditioner.use();
}catch (Exception e){
System.out.println(e.getMessage());
}
}
}
运行结果: