抽象工厂提供一个创建一系列相关或相互依赖的对象的接口
适合一系列产品同一产品族一起使用创建的场景
产品族的概念可以到我写的另一篇关于工厂方法的博客中查看
将一个系列的产品统一到一起进行创建
我们用电子产品来举例说明,简单设定一个场景吧
假设我的游戏笔记本与锤子手机坏掉了(呸呸呸,千万别坏),我需要一台新的电脑和手机
//手机
public interface Phone {
void produce();
}
//电脑
public interface Computer {
void produce();
}
emmm,我想要苹果手机与mac电脑
public class AppleComputer implements Computer {
@Override
public void produce() {
System.out.println("大家好,我是苹果电脑");
}
}
public class ApplePhone implements Phone {
@Override
public void produce() {
System.out.println("大家好,我是苹果手机");
}
}
我去找一家工厂来帮我把手机与电脑生产出来吧
public interface ElectronicFactory {
Computer getComputer();
Phone getPhone();
}
那工厂问我,你想要什么牌子的手机与电脑啊,我说:苹果吧,好看。
然后它就帮我找了一家苹果的工厂,这个工厂呢又生产手机又生产电脑
public class AppleFactory implements ElectronicFactory {
@Override
public Computer getComputer() {
return new AppleComputer();
}
@Override
public Phone getPhone() {
return new ApplePhone();
}
}
生产出来之后,我们就去拿货吧
public class Test {
public static void main(String[] args) {
ElectronicFactory electronicFactory = new AppleFactory();
Computer computer = electronicFactory.getComputer();
Phone phone = electronicFactory.getPhone();
computer.produce();
phone.produce();
}
}
别丢香蕉皮啊,我用的华为手机(我还是爱国的),到这里,抽象工厂呢就已经写完了,其实仔细观察是可以发现,抽象工厂与工厂方法基本都是差不多的,只不过工厂方法是创建单一产品,而抽象工厂是创建同一产品族的所有产品,一个是生产同一种产品的工厂,一个是生产一系列产品的工厂
在新增产品族的时候,抽象工厂是符合开闭原则的,但是如果要在一个产品族内新增一个产品的话,是需要修改接口的,改动还挺大,这样就违背了开闭原则,具体使用什么,还是得根据具体的业务来决定,在使用抽象工厂的时候,如果半年至一年时间新增一个产品,那么还是可以接受的,如果产品新增很频繁的话,就不是那么适合了,还是那句话,根据具体业务来决定使用什么
代码已同步码云,点击即可跳转过去
原文:https://www.cnblogs.com/islcz/p/12459329.html