ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-03-06 13:03:30  阅读:164  来源: 互联网

标签:java package GoF 实例 产品 abstractFactory 设计模式 TODO public


定义:

产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机、海信电视机、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();

	}

}

运行结果:

标签:java,package,GoF,实例,产品,abstractFactory,设计模式,TODO,public
来源: https://blog.csdn.net/weixin_54622151/article/details/123307852

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有