您的位置:首页 > 其它

创建型模式之三——抽象工厂模式

2015-10-09 12:06 316 查看

模式动机

在工厂方法模式中具体工厂负责生成具体的产品,每一个具体产品对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或一组重载的工厂方法。但是有的时候我们需要一个工厂可以提供多个产品对象,而不是单一的产品对象,如一个电器设备工厂,它可以生产电视机、电冰箱、空调等设备,而不只是生产某种类型的电器。为了更清晰地理解抽象工厂模式,需要引入两个概念:

产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机等,那么抽象电视机和具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。

产品族:在抽象工厂模式中,产品族是指由同一工厂生产的,位于不同产品等级结构中的一组产品。如海尔工厂生产海尔电视、海尔冰箱等。

模式定义

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

模式结构

抽象工厂模式结构图如图所示:



1.AbstractFactory(抽象工厂)

抽象工厂用于声明生产抽象产品的方法,在一个抽象工厂中可以定义一组方法,每一个方法对应一个产品等级结构。

2.ConcreteFactory(具体工厂)

具体工厂实现了抽象工厂声明的生产抽象产品的方法,生产一组具体方法,这些产品构成一个产品族,每一个产品都位于某个产品等级结构中。

3.AbstractProduct(抽象产品)

抽象产品为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法。

4.ConcreteProduct(具体产品)

具体产品定义具体工厂生产的具体产品对象,实现抽象产品接口定义中的业务方法。

实例

一个电器工厂可以生产多种类型的电器,如海尔工厂可以生产海尔电视机,海尔空调等,TCL工厂也可以生产对应的电器。

如图是该实例类图。



// 抽象产品类
public interface Television {
public void play();
}

public interface AirConditioner {
public void changeTemperature();
}

// 具体产品类
public class HaierTelevision implements Television {
public void play() {
System.out.println("海尔电视机播放中.");
}
}

public class TCLTelevision implements Television {
public void play() {
System.out.println("TCL电视机播放中.");
}
}

public class HaierAirConditioner implements AirConditioner {
public void changeTemperature() {
System.out.println("海尔空调控温中");
}
}

public class HaierAirConditioner implements AirConditioner {
public void changeTemperature() {
System.out.println("TCL空调控温中");
}
}

// 抽象工厂类
public interface EFactory {
public Television produceTelevision();
public AirConditioner produceAirConditioner();
}

// 具体工厂类
public class HaierFactory implements EFactory {
public Television produceTelevison() {
return new HaierTelevision();
}

public AirConditioner produceAirConditioner {
return new HaierAirConditioner();
}
}

public class TCLFactory implements EFactory {
public Television produceTelevison() {
return new TCLTelevision();
}

public AirConditioner produceAirConditioner {
return new TCLAirConditioner();
}
}

// 测试
public class Client {
public static void main(String[] args) {
Televison tv;
AirConditioner airConditioner;
EFactory factory = new HaierFactory();

tv = factory.produceTV();
airConditioner = factory.produdeAirConditioner();

tv.play();
airConditioner.changeTemperature();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: