个人学习笔记
引入术语
产品等级结构与产品族
产品等级结构:产品的继承结构。举例:海尔的冰箱,TCL的冰箱都继承于抽象的冰箱类。所以他们是一个产品等级结构。
产品族:即同一个具体工厂生产的东西。海尔的冰箱,海尔的空调都是海尔工厂生产的。属于同一族。
抽象工厂模式概述
抽象工厂的引入,是为了解决当工厂方法引入新的具体产品时,与之成对增加的具体工厂的问题。
抽象工厂与工厂方法最大的区别在于,抽象工厂需要面对多个产品等级结构,而工厂方法针对的是一个产品等级结构。
但同样的抽象工厂也有缺点,即开闭原则的倾向性。当增加产品族时,抽象工厂满足开闭原则,但增加产品等级结构时,会破坏开闭原则
抽象工厂模式结构
AbstractFactory(抽象工厂)
声明一组创建一族产品的方法,每一个方法对应一种产品。(它是一个接口,也就注定了我们只可以创建新的工厂,而不能增加新的产品,也就是我们所说的可以增加产品族,而不能增加产品等级结构。)
ConcreteFactory(具体工厂)
实现接口
AbstractProduct(抽象产品)
抽象类
ConcreteProduct(具体产品)
继承抽象类
抽象工厂模式应用实例
例题
在一款赛车软件中,有两款车型:SUV和Sports。根据用户级别不同,程序需要对两款车型分别提供高级和中级配置。 产品类图如图所示:请应用抽象工厂模式完成以下要求:
- 绘制产品族和产品等级结构图。
- 编写完整项目代码,并在主程序中根据键盘输入的赛车的类型及级别来完成赛车的创建与启动。
- 现在需要为每种车型增加一个新的级别Slow, 请修改程序,满足这个需求。会不会违反OO设计原则?
- 思考: 如果新增一款车型,如Bicycle,也有Slow,Med,High之分。会不会违反OO设计原则?
- 使用反射技术,在程序运行时生成一个具体工厂,完成任意一种赛车的创建与启动。
- 应用反射技术,将抽象工厂层次结构去掉,换成简单工厂,在程序运行时态生成一种赛车并启动。
首先分析:SUV和Sports是抽象类所以他俩是产品等级结构,而高级和中级配置是产品族。所以这里的具体工厂是高级工厂和低级工厂。
SUV和Sports是产品等级结构,则一定会需要两个抽象类,一个是SUV,一个是Sports
这里展示一下代码大致结构。src下有两个包和两个类以及一个xml文件
展示类图
展示抽象类 SUV
和Sports
package Product;
public abstract class Sports {
public abstract void produce();
}
public abstract class SUV {
public abstract void produce();
}
展示具体产品 HighSports
,HighSUV
,MedSports
和MedSUV
package Product;
public class HighSports extends Sports{
@Override
public void produce() {
System.out.println("this is a HighSports");
}
}
public class HighSUV extends SUV{
@Override
public void produce() {
System.out.println("this is a HighSUV");
}
}
public class MedSports extends Sports{
@Override
public void produce() {
System.out.println("this is a MedSports");
}
}
public class MedSUV extends SUV{
@Override
public void produce() {
System.out.println("this is a MedSUV");
}
}
展示抽象工厂 CarFactory
package Factory;
import Product.*;
/*这里低中高应该是一个产品族,SUV和Sports是产品等级结构*/
public interface CarFactory {
public SUV SUVFactory();
public Sports SportsFactory();
}
展示具体工厂 HighFactory
和 MedFactory
package Factory;
import Product.*;
public class HighFactory implements CarFactory {
@Override
public SUV SUVFactory() {
return new HighSUV();
}
@Override
public Sports SportsFactory() {
return new HighSports();
}
}
public class MedFactory implements CarFactory{
@Override
public SUV SUVFactory() {
return new MedSUV();
}
@Override
public Sports SportsFactory() {
return new MedSports();
}
}
展示反射以及xml文件
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.*;
public class xmlutil{
public static Object getBean() throws IOException, SAXException, ParserConfigurationException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder buider=factory.newDocumentBuilder();
Document doc;//创建文档对象
doc=buider.parse(new File("src//Factory.xml"));
NodeList nl=doc.getElementsByTagName("className");
Node classsNode=nl.item(0).getFirstChild();
String cName= classsNode.getNodeValue().trim();
Class<?> c=Class.forName(cName);
Object obj=c.getDeclaredConstructor().newInstance();
return obj;
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<config>
<className>Factory.HighFactory</className>
<className>Factory.MedFactory</className>
</config>