设计模式的艺术 抽象工厂模式

本文深入解析抽象工厂模式,探讨其如何解决工厂方法模式中的问题,通过示例代码展示如何创建一系列相关或相互依赖的对象,同时保持高度的灵活性和扩展性。适合希望深入了解设计模式的开发者阅读。

不懂使用为学过,说出用途,绘制结构为了解,不会灵活使用基本等于没学。

前言

工厂方法模式引入了工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销,此时,可以考虑一些相关产品组成的产品族,由同一工厂来统一生产,这就是抽象工厂模式的基本思想.

抽象工厂模式的定义   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();
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值