(2)GoF设计模式之抽象工厂模式及其实例

定义:

产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机不具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于丌同产品等级结构中的一组产品,例如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

优点:

隔离了具体类的生成,使得客户端并不需要知道什么被创建

当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象

增加新的产品族很方便,无须修改已有系统,符合开闭原则

缺点:

增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的丌便,违背了开闭原则

适用环境:

一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节

系统中有多于一个的产品族,但每次只使用其中某一产品族

属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来

产品等级结构稳定,在设计完成之后丌会向系统中增加新的产品等级结构或者删除已有的产品等级结构

UML图:

实例目录:

具体代码:

TV.java

package abstractFactory;

public interface TV {
	public void play();

}

HaierTV.java

package abstractFactory;

public class HaierTV implements TV{
	public void play() {
		System.out.println("海尔电视播放中");
	}

}

HisenseTV.java

package abstractFactory;

public class HisenseTV implements TV {

	@Override
	public void play() {
		// TODO Auto-generated method stub
		System.out.println("海信电视播放中");

	}

}

AirConditioner.java

package abstractFactory;

public interface AirConditioner {
	public void changeTemperture();

}

HaierAirConditioner.java

package abstractFactory;

public class HaierAirConditioner implements AirConditioner {

	@Override
	public void changeTemperture() {
		// TODO Auto-generated method stub
		System.out.println("海尔空调制冷中...");
	}

}

HisenseAirConditioner.java

package abstractFactory;

public class HisenseAirConditioner implements AirConditioner {

	@Override
	public void changeTemperture() {
		// TODO Auto-generated method stub
		System.out.println("海信空调制冷中...");

	}

}

Factory.java

package abstractFactory;

public interface Factory {
     public TV produceTV();
     public  AirConditioner produceAirConditioner();
}

HaierFactory.java

package abstractFactory;

public class HaierFactory implements Factory {

	@Override
	public TV produceTV() {
		// TODO Auto-generated method stub
		
		return new HaierTV();
 
	}

	@Override
	public AirConditioner produceAirConditioner() {
		// TODO Auto-generated method stub
		
		return new HaierAirConditioner();

	}

}

HisenseFactory.java

package abstractFactory;

public class HisenseFactory implements Factory {

	@Override
	public TV produceTV() {
		// TODO Auto-generated method stub
		return new HisenseTV();

	}

	@Override
	public AirConditioner produceAirConditioner() {
		// TODO Auto-generated method stub
		return new HisenseAirConditioner();

	}

}

XMLUtil.java

package abstractFactory;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class XMLUtil {
	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;
		}
	}


}

abstractFactoryConfig.java

<?xml version="1.0" encoding="UTF-8"?>
<config>
  <className>abstractFactory.HaierFactory</className>
</config>

Client.java

package abstractFactory;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TV tv;
		AirConditioner ac;
		Factory factory;
		factory=(Factory)XMLUtil.getBean();
		ac=factory.produceAirConditioner();
		tv=factory.produceTV();
		tv.play();
		ac.changeTemperture();

	}

}

运行结果:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪 华 杉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值