目录
1.抽象工厂模式
①定义
抽象工厂模式是一种为访问类提供一个创建一组相关或相互依赖对象的接口,其访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构.抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
②使用条件
1)系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
2)系统一次只可能消费其中某一族产品,即同族的产品一起使用。
③产品等级结构与产品族
产品等级结构:继承结构,不同产品,可以理解为x轴,如冰箱
产品族:指有一个工厂生产的,位于不同产品等级结构中的一组产品,可以理解为y轴,如海尔冰箱,海信冰箱
注意: 增加产品族符合开闭原则, 增加产品等级结构违背开闭原则
2.主要角色
抽象工厂(Abstract Factory)
具体工厂(Concrete Factory)
抽象产品(Product)
具体产品(Concrete Product)
3.例题
一个电器工厂可以产生多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,TCL工厂可以生产TCL电视机、TCL空调等,相同品牌的电器构成一个产品族,而相同类型的电器构成一个产品等级结构,使用抽象工厂模式模拟该场景,要求绘制相应的类图并用Java语言模拟实现。
①类图
②代码:
//1)创建抽象产品角色Television
public abstract class Television {
public void play() {
}
}
//2)创建具体产品角色HaierTelevision
public class HaierTelevision extends Television{
public void play() {
System.out.println("Haier电视机播放!");
}
}
//3)创建具体产品角色TCLTelevision
public class TCLTelevision extends Television{
public void play() {
System.out.println("TCL电视机播放!");
}
}
//4)创建抽象产品角色AirConditioner
public class AirConditioner {
public void changeTemperature() {
}
}
//5)创建具体产品角色HaierConditioner
public class HaierConditioner extends AirConditioner{
public void changeTemperature() {
System.out.println("Haier空调控制温度!");
}
}
//6)创建具体产品角色TCLConditioner
public class TCLConditioner extends AirConditioner{
public void changeTemperature() {
System.out.println("TCL空调控制温度!");
}
}
//7)创建抽象工厂角色ElectricFactory
public abstract class ElectricFactory {
public abstract Television produceTelevision() ;
public abstract AirConditioner produceAirConditioner();
}
//8)创建具体工厂角色HaierFactory
public class HaierFactory extends ElectricFactory{
public Television produceTelevision() {
Television haierTelevision=new HaierTelevision();
return haierTelevision;
}
public AirConditioner produceAirConditioner() {
AirConditioner haierConditioner=new HaierConditioner();
return haierConditioner;
}
}
//9)创建具体工厂角色TCLFactory
public class TCLFactory extends ElectricFactory{
public Television produceTelevision() {
Television tclTelevision=new TCLTelevision();
return tclTelevision;
}
public AirConditioner produceAirConditioner() {
AirConditioner tclConditioner=new TCLConditioner();
return tclConditioner;
}
}
//10)创建测试类Client
import java.util.Scanner;
public class Client {
public static ElectricFactory fac1,fac2;
public static Television tel1,tel2;
public static AirConditioner airCon1,airCon2;
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
fac1 = new HaierFactory();
fac2 = new TCLFactory();
tel1=fac1.produceTelevision();
tel2=fac2.produceTelevision();
airCon1=fac1.produceAirConditioner();
airCon2=fac2.produceAirConditioner();
while(true)
{
System.out.println("请输入您想要的选择:");
System.out.println("1:Haier电视机 2:TCL电视机 ");
System.out.println("3:Haier空调 4:TCL空调 ");
int i=scanner.nextInt();
if(i==1){
tel1.play();}
else if(i==2){
tel2.play();}
else if(i==3){
airCon1.changeTemperature();}
else if(i==4){
airCon2.changeTemperature();}
else {
System.out.println("输入有误, 请按照提示再次输入!");}
}
}
}