您的位置:首页 > 其它

抽象工厂模式

2016-03-24 16:08 381 查看
比工厂方法模式 的抽象程度更高,这个模式中,具体工厂可以生产相关的一组具体产品,

这样的一组产品称之为产品族,产品族中的每一个产品都分属于某一个产品继承等级结构。

下面举例:电器工厂

一个电器工厂可以生产多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,

TCL工厂可以生产TCL电视机、TCL空调等,相同品牌的电器构成一个产品族,

而相同类型的电器够成了一个产品等级结构。

源码下载:下载地址

package com.th.designedmodemofchouxianggongchang;
/********
* 	抽象产品类Television(电视机类)
* 	它可以是一个接口,也可以是一个抽象类
* 	其中包含业务方法 	play() 的声明
*/
public interface Television {
public void play();
}

package com.th.designedmodemofchouxianggongchang;
/******
* HaierTelevision 是 Television 的子类
* 实现了在 Television 中定义的业务方法 play()
* */
public class HaierTelevision implements Television {

@Override
public void play() {
System.out.println("海尔电视机播放中......");
}
}

package com.th.designedmodemofchouxianggongchang;
/*****
*	TCLTelevision 是 Television 的另一个子类
* 	也实现了在 Television 中定义的业务方法 play()
* */
public class TCLTelevision implements Television {

@Override
public void play() {
System.out.println("TCL电视机播放中......");
}
}

package com.th.designedmodemofchouxianggongchang;
/*******
* 	AirConditioner 是另一种抽象产品类,
* 	它可以是一个接口,也可以是一个抽象类
* 	其中包含业务方法 changeTemperature() 的声明
* */
public interface AirConditioner {
public void changeTemperature();
}

package com.th.designedmodemofchouxianggongchang;
/******
* 	HaierAirConditioner 是 AirConditioner 的子类
* 	实现了在 AirConditioner 中定义 的业务方法 changeTemperature()
* */
public class HaierAirConditioner implements AirConditioner {

@Override
public void changeTemperature() {
System.out.println("海尔空调温度改变中......");
}
}

package com.th.designedmodemofchouxianggongchang;
/******
* 	TCLAirConditioner 也是 AirConditioner 的子类
* 	实现了在 AirConditioner 中定义 的业务方法 changeTemperature()
* */
public class TCLAirConditioner implements AirConditioner {

@Override
public void changeTemperature() {
System.out.println("TCL空调温度改变中......");
}
}

package com.th.designedmodemofchouxianggongchang;
/*
* 	抽象工厂类,定义了抽象工厂方法
* 	针对每一个产品族 的产品都提供了一个对应的工厂方法
* */
public interface EFactory {
public Television produceTelevision();
public AirConditioner produceAirConditoner();
}

package com.th.designedmodemofchouxianggongchang;
/*****
* 	HaierFactory 是 EFactory 的一个子类
* 	实现了在 EFactory 中定义的工厂方法,用于创建具体产品对象
* 	HaierFactory 所生产的具体产品构成了一个产品族
* */
public class HaierFactory implements EFactory {

@Override
public Television produceTelevision() {

return new HaierTelevision();
}

@Override
public AirConditioner produceAirConditoner() {
return new HaierAirConditioner();
}
}

package com.th.designedmodemofchouxianggongchang;
/*****
* 	TCLFactory 也是 EFactory 的一个子类
* 	实现了在 EFactory 中定义的工厂方法,用于创建具体产品对象
* 	TCLFactory 所生产的具体产品构成了一个产品族
* */
public class TCLFactory implements EFactory {

@Override
public Television produceTelevision() {

return new TCLTelevision();
}

@Override
public AirConditioner produceAirConditoner() {
return new TCLAirConditioner();
}
}

package com.th.designedmodemofchouxianggongchang;

import javax.xml.parsers.*;
import org.w3c.dom.*;
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("config.xml"));

NodeList nl = doc.getElementsByTagName("className");
Node classNode = nl.item(0).getFirstChild();
String cName = classNode.getNodeValue().trim();

Class c = Class.forName(cName);
Object obj = c.newInstance();
return obj;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
}

package com.th.designedmodemofchouxianggongchang;
/*****
* 	客户端测试类 Client
* */
public class Client {

public static void main(String[] args) {
try
{
EFactory factory;
Television tv;
AirConditioner ac;
factory = (EFactory) XMLUtil.getBean();
tv = factory.produceTelevision();
tv.play();
ac = factory.produceAirConditoner();
ac.changeTemperature();
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}


配置文件,若生产海尔电视机和空调直接修改此文件即可
<?xml version="1.0" ?>
<config>
<className>com.th.designedmodemofchouxianggongchang.TCLFactory</className>
</config>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式