抽象工厂模式
参考文档:http://c.biancheng.net/view/1351.html
总综合工厂
工厂方法模式只考虑生产同等级的产品,
但是在现实生活中许多工厂是综合型的工厂,能生产多等级(种类) 的产品;
如电器厂既生产电视机又生产洗衣机或空调等。
抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族。
比如 针对电器厂及生产电视有生产洗衣机这种模式 构成一个产品族,
其中生产电视机为一个级别,生产洗衣机为一个级别。
产品族之间也应该有类型上的差异,而这些差异在同一产品族中各个级别都有体现。
比如TC系列产品:TC电视机,TC洗衣机,
区别于海尔系列:海尔电视机,海尔洗衣机。
电视机,洗衣机为系列中的不同级别。
抽象工厂模式的扩展有一定的“开闭原则”倾斜性:
- 当增加一个新的产品族时只需增加一个新的具体工厂,不需要修改原代码,满足开闭原则。
- 当产品族中需要增加一个新种类的产品时,则所有的工厂类都需要进行修改,不满足开闭原则。
demo 结构
1.工厂接口 、hair工厂实现类,TC工厂实现类。
2.商品接口、电视机接口,洗衣机接口。并且商品接口是电视机接口与洗衣机接口的父接口。
TC电视机实现类,TC洗衣机是下类;海尔电视机实现类,海尔洗衣机实现类。
demo代码
step1.工厂接口与工厂实现类
总的工厂接口
package java_basic.stu_design_mode.stu_AbstractFactory;
public interface MachineFactory {
TelevisionMachine getTelevision();
LaundryMachine getLaundry();
}
hair工厂实现类
package java_basic.stu_design_mode.stu_AbstractFactory;
public class HairFactory implements MachineFactory {
@Override
public TelevisionMachine getTelevision() {
return new HairTelevision();
}
@Override
public LaundryMachine getLaundry() {
return new HairLaundry();
}
}
TC工厂实现类
package java_basic.stu_design_mode.stu_AbstractFactory;
public class TCFacory implements MachineFactory {
@Override
public TelevisionMachine getTelevision() {
return new TCTelevision();
}
@Override
public LaundryMachine getLaundry() {
return new TCLaundry();
}
}
step2 商品接口
总的商品接口,约定所有商品的共同接口
package java_basic.stu_design_mode.stu_AbstractFactory;
public interface Machine {
String getMachineName();
}
级别接口。由于不同品族的相同级别的商品存在共性,因此提出接口。
电视级别的接口
package java_basic.stu_design_mode.stu_AbstractFactory;
public interface TelevisionMachine extends Machine{
void operationTelevision();
}
洗衣机级别的接口
package java_basic.stu_design_mode.stu_AbstractFactory;
public interface LaundryMachine extends Machine {
void operationLaundry();
}
step3 商品实现类
hair品族
hair电视机实现类
package java_basic.stu_design_mode.stu_AbstractFactory;
public class HairTelevision implements TelevisionMachine {
@Override
public void operationTelevision() {
System.out.println("Hair电视机的区别于其他电器的操作");
}
@Override
public String getMachineName() {
return "this is Hair television";
}
}
hair洗衣机实现类
package java_basic.stu_design_mode.stu_AbstractFactory;
public class HairLaundry implements LaundryMachine {
@Override
public String getMachineName() {
return "this is hair laundry";
}
@Override
public void operationLaundry() {
System.out.println("Hair洗衣机的区别于其他电器的操作");
}
}
TC品族
TC电视机
package java_basic.stu_design_mode.stu_AbstractFactory;
public class TCTelevision implements TelevisionMachine {
@Override
public String getMachineName() {
return "this is TC television";
}
@Override
public void operationTelevision() {
System.out.println("TC电视机的区别于其他电器的操作");
}
}
TC洗衣机
package java_basic.stu_design_mode.stu_AbstractFactory;
public class TCLaundry implements LaundryMachine {
@Override
public String getMachineName() {
return "this is Tc laundry";
}
@Override
public void operationLaundry() {
System.out.println("TC洗衣机的区别于其他电器的操作");
}
}
step4 调用
package java_basic.stu_design_mode.stu_AbstractFactory;
import org.junit.Test;
public class Main {
@Test
public void method() {
//获取hair产品族工厂
MachineFactory hr = new HairFactory();
LaundryMachine lm = hr.getLaundry();
lm.operationLaundry();//Hair洗衣机的区别于其他电器的操作
System.out.println(lm.getMachineName());//this is hair laundry
//获取TC产品族工厂
MachineFactory tc = new TCFacory();
TelevisionMachine tcs = tc.getTelevision();
tcs.operationTelevision();//TC电视机的区别于其他电器的操作
System.out.println(tcs.getMachineName());//this is TC television
}
}