← 返回首页
设计模式基础教程(十)
发表时间:2021-08-21 18:36:26
抽象工厂模式

1.抽象工厂模式 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

当系统所提供的工厂所需生产的具体产品并不是一个简单的对象,而是多个位于不同产品等级结构中属于不同类型的具体产品时需要使用抽象工厂模式。

抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形态。

抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构,一个工厂等级结构可以负责多个不同产品等级结构中的产品对象的创建 。当一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象时,抽象工厂模式比工厂方法模式更为简单、有效率。

2.实例

一个电器工厂可以产生多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,TCL工厂可以生产TCL电视机、TCL空调等,相同品牌的电器构成一个产品族,而相同类型的电器构成了一个产品等级结构,现使用抽象工厂模式模拟该场景。

项目结构图如下:

定义电视和空调抽象产品接口

//Television.java
public interface Television {
    void play();
}
//AirConditioner.java
public interface AirConditioner {
    void changeTemperature();
}

海尔电视空调/TCL电视空调产品类

//HaierTelevision.java
public class HaierTelevision implements Television {
    public HaierTelevision() {
        System.out.println("创建海尔电视机");
    }
    @Override
    public void play() {
        System.out.println("海尔电视机播放中...");
    }

}

//HaierAirConditioner.java
public class HaierAirConditioner implements AirConditioner {
    public HaierAirConditioner() {
        System.out.println("创建海尔空调");
    }
    @Override
    public void changeTemperature() {
        System.out.println("海尔空调温度改变中...");
    }
}
//TCLTelevision.java
public class TCLTelevision implements Television {

    public TCLTelevision() {
        System.out.println("创建TCL电视机");
    }
    @Override
    public void play() {
        System.out.println("TCL电视机播放中...");
    }
}

//TCLAirCondioner.java
public class TCLAirCondioner implements AirConditioner {
    public TCLAirCondioner() {
        System.out.println("创建TCL空调");
    }
    @Override
    public void changeTemperature() {
        System.out.println("TCL空调温度改变中...");
    }
}

定义抽象工厂接口

//EFactory.java
import com.simoniu.domain.AirConditioner;
import com.simoniu.domain.Television;

public interface EFactory {
    Television produceTelevision();
    AirConditioner produceAirConditioner();
}

定义海尔/TCL工厂类

//HaierFactory.java
public class HaierFactory implements EFactory {
    @Override
    public Television produceTelevision() {
        System.out.println("海尔工厂生产海尔电视机");
        return new HaierTelevision();
    }
    @Override
    public AirConditioner produceAirConditioner() {
        System.out.println("海尔工厂生产海尔空调");
        return new HaierAirConditioner();
    }
}
//TCLFactory.java
public class TCLFactory implements EFactory {
    @Override
    public Television produceTelevision() {
        System.out.println("TCL工厂生产TCL电视机");
        return new TCLTelevision();
    }

    @Override
    public AirConditioner produceAirConditioner() {
        System.out.println("TCL工厂生产TCL空调");
        return new TCLAirCondioner();
    }
}

XML解析工具类

package com.simoniu.utils;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

public class XMLUtils {

    public static Object getBean(){
        DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder documentBuilder=  documentBuilderFactory.newDocumentBuilder();
            Document doc=documentBuilder.parse(XMLUtils.class .getClassLoader().getResourceAsStream("config.xml"));
            String className=doc.getElementsByTagName("className").item(0).getTextContent();
            return Class.forName(className).newInstance();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

配置文档

<?xml version="1.0"?>
<config>
    <!-- <className>com.simoniu.factory.TCLFactory</className> -->
    <className>com.simoniu.factory.HaierFactory</className>
</config>

测试类

public class TestAbstractFactoryPatternDemo01 {
    public static void main(String[] args) {
        Television television;
        AirConditioner airConditioner;
        EFactory factory=null;

        factory=(EFactory) XMLUtils.getBean();
        television=factory.produceTelevision();
        airConditioner=factory.produceAirConditioner();

        television.play();
        airConditioner.changeTemperature();

    }

}

运行结果:
海尔工厂生产海尔电视机
创建海尔电视机
海尔工厂生产海尔空调
创建海尔空调
海尔电视机播放中...
海尔空调温度改变中...