工厂方法模式只考虑生产同种类的产品,但是现实生活中许多工厂是综合型的工厂,能生产多种类的产品。如工厂既生成收集有生成电脑
抽象工厂模式除了具有工厂方法模式的优点外,其他优点如下:
缺点:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。违法了“开闭原则”
适用场景:
结构:
实现:
public class FactoryTest {
public static void main(String[] args) {
// 可以通过配置文件进行类名的配置,然后实例化对应的具体工厂类
Factory factory = new HuaweiFactory();
Phone phone = factory.newPhone();
phone.show();
Computer computer = factory.newComputer();
computer.show();
}
}
// 抽象产品:手机
interface Phone {
public void show();
}
// 具体产品:华为手机
class HuaweiPhone implements Phone {
public void show() {
System.out.println("华为手机显示");
}
}
// 具体产品:小米手机
class XiaomiPhone implements Phone {
public void show() {
System.out.println("小米手机显示");
}
}
// 抽象产品:电脑
interface Computer {
public void show();
}
// 具体产品:华为电脑
class HuaweiComputer implements Computer {
public void show() {
System.out.println("华为电脑显示");
}
}
// 具体产品:小米电脑
class XiaomiComputer implements Computer {
public void show() {
System.out.println("小米电脑显示");
}
}
// 抽象工厂
interface Factory {
public Phone newPhone();
public Computer newComputer();
}
// 具体工厂:华为工厂
class HuaweiFactory implements Factory {
public Phone newPhone() {
System.out.println("华为工厂生成---华为手机");
return new HuaweiPhone();
}
public Computer newComputer() {
System.out.println("华为工厂生成---华为电脑");
return new HuaweiComputer();
}
}
// 具体工厂:小米工厂
class XiaomiFactory implements Factory {
public Phone newPhone() {
System.out.println("小米工厂生成---小米手机");
return new XiaomiPhone();
}
public Computer newComputer() {
System.out.println("小米工厂生成---小米电脑");
return new XiaomiComputer();
}
}
运行程序,结果如下:
华为工厂生成---华为手机
华为手机显示
华为工厂生成---华为电脑
华为电脑显示