不懂使用为学过,说出用途,绘制结构为了解,不会灵活使用基本等于没学。
前言
工厂方法模式引入了工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销,此时,可以考虑一些相关产品组成的产品族,由同一工厂来统一生产,这就是抽象工厂模式的基本思想.
抽象工厂模式的定义 Abstract Factory Pattern
提供一个创建一系列相关或者相互依赖的对象的接口,而无须指定它们具体的类。抽象工厂模式又被称之为kit模式,它是一种对象创建型模式
抽象工厂模式的优点
(1)、抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂显得相对容易,所有的具体工厂都实现在抽象工厂中声明的那些公共接口,因为只需要改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为
(2)、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族的对象
(3)、增加新的产品族很方便,无须修改已有系统,符合开闭原则
抽象工厂模式的缺点
新增产品的等级结构比较麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层的代码,这显然带来了很大的麻烦,不符合开闭原则
抽象工厂模式的应用场景
(1)、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦
(2)、系统中有多于一个的产品族,而每次却只需要使用一个产品族时,可以通过配置文件等方式使得用户可以动态的改变产品族,也可以很方便的增加新的产品族
(3)、属于同一个产品族的产品将一起使用,这一约束必须在系统的设计中体现出来。同一个产品族中的产品可以是没有任何关系的对象,但是它们都有同一约束。举个栗子,同一系统下的按钮和文本框,它们之间并没有任何直接关系,但它们都是属于某一个操作系统,此时具有一个共同的约束条件:操作系统的类型。
(4)、当产品的等级结构稳定,设计完成后,不会向系统中增加新的产品等级结构或者删除已有产品等级结构
抽象工厂模式的具体实现
(1)、项目结构

(2)、产品等级
public interface Button {
void display();
}
public interface ComboBox {
void display();
}
public interface TextField {
void display();
}
(3)、抽象工厂接口
//工厂类的基类
public interface SkinFactory {
Button createButtion();
TextField createTextField();
ComboBox createComboBox();
}
(4)、具体的工厂实现
public class SpringSkinFactory implements SkinFactory {
@Override
public Button createButtion() {
return new SummerButton();
}
@Override
public TextField createTextField() {
return new SpringTextField();
}
@Override
public ComboBox createComboBox() {
return new SpringComboBox();
}
}
public class SummerSkinFactory implements SkinFactory {
@Override
public Button createButtion() {
return new SummerButton();
}
@Override
public TextField createTextField() {
return new SummerTextField();
}
@Override
public ComboBox createComboBox() {
return new SummerComboBox();
}
}
(4)、辅助类
public class XMLUtil {
public static Object getType( ) throws Exception {
//Doucment对象的获取
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
Document doc = documentBuilder.parse(XMLUtil.class.getClassLoader().getResource("").getPath() + "config.xml");
NodeList list = doc.getElementsByTagName("className");
Node classNode = list.item(0).getFirstChild();
String type = classNode.getNodeValue();
//通过类名生成实例对象并将其返回
Class c = Class.forName(String.valueOf(type));
Object obj = c.newInstance();
return obj;
}
}
(5)、配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<config>
<className>com.company.factory.SpringSkinFactory</className>
<className>com.company.factory.SummerSkinFactory</className>
</config>
(6)、测试类
public static void main(String[] args) {
//使用抽象层的定义
SkinFactory factory;
Button button;
TextField textField;
ComboBox comboBox;
try {
factory=(SpringSkinFactory) XMLUtil.getType();
button=factory.createButtion();
textField=factory.createTextField();
comboBox=factory.createComboBox();
button.display();
textField.display();
comboBox.display();
} catch (Exception e) {
e.printStackTrace();
}
}
}
本文深入解析抽象工厂模式,探讨其如何解决工厂方法模式中的问题,通过示例代码展示如何创建一系列相关或相互依赖的对象,同时保持高度的灵活性和扩展性。适合希望深入了解设计模式的开发者阅读。
3153

被折叠的 条评论
为什么被折叠?



