工厂方法的缺点
之前我们说过了Java设计模式—工厂方法,它的好处就是降低了耦合度,使我们能够更专注做自己的事情。但是有一点很不好,每一个产品都对应一个工厂,也就是说,将来我们要增加产品时,还要增加与之对应的工厂类,这样当项目相对大起来之后,会类爆炸,因此在实际开发中,更加常用的是抽象工厂。
产品等级结构和产品族
产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类分别是海尔电视机,TCL电视机,海信电视机,则电视机和其子类形成了产品等级结构
产品族:在抽象工厂中,产品族是由同一个工厂生产的,位于不同产品等级结构的一组产品,例如海尔工厂生产的海尔电视机,海尔冰箱,海尔空调构成了一个产品族
如果我们使用工厂方法,对于这6个产品,则需要6个工厂;而使用抽象工厂,则需要2个工厂就够了(与产品族对应)
模式结构和代码
一:产品类
抽象电视产品
public interface TV {
void play();
}
具体TCL TV产品
public class TCLTV implements TV{
@Override
public void play() {
System.out.println("TCL TV播放...");
}
}
具体海尔TV产品
public class HaierTV implements TV{
@Override
public void play() {
System.out.println("海尔TV播放...");
}
}
抽象空调产品
public interface AirConditioner {
void changeTemperature();
}
具体TCl空调产品
public class TCLAirConditioner implements AirConditioner{
@Override
public void changeTemperature() {
System.out.println("TCL空调改变中...");
}
}
具体海尔空调产品
public class HaierAirConditioner implements AirConditioner{
@Override
public void changeTemperature() {
System.out.println("海尔空调改变中...");
}
}
抽象冰箱产品
public interface Fridge {
void working();
}
具体TCL冰箱产品
public class TCLFridge implements Fridge{
@Override
public void working() {
System.out.println("TCL冰箱工作中");
}
}
具体海尔冰箱产品
public class HaierFridge implements Fridge{
@Override
public void working() {
System.out.println("海尔冰箱工作中");
}
}
二:工厂类
抽象工厂接口
public interface Factory {
TV productTV();
AirConditioner productAirConditioner();
Fridge productFridge();
}
海尔工厂
public class HaierFactory implements Factory{
@Override
public TV productTV() {
return new HaierTV();
}
@Override
public AirConditioner productAirConditioner() {
return new HaierAirConditioner();
}
@Override
public Fridge productFridge() {
return new HaierFridge();
}
}
TCL工厂
public class TCLFactory implements Factory{
@Override
public TV productTV() {
return new TCLTV();
}
@Override
public AirConditioner productAirConditioner() {
return new TCLAirConditioner();
}
@Override
public Fridge productFridge() {
return new TCLFridge();
}
}
二:测试
public class Client {
public static void main(String[] args) {
Factory factory = new HaierFactory();
TV tv = factory.productTV();
AirConditioner airConditioner = factory.productAirConditioner();
Fridge fridge = factory.productFridge();
tv.play();
airConditioner.changeTemperature();
fridge.working();
}
}
结果: