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();
}
}
运行结果:
标签:java,package,GoF,实例,产品,abstractFactory,设计模式,TODO,public 来源: https://blog.csdn.net/weixin_54622151/article/details/123307852