抽象工厂模式
抽象工厂模式是工厂方法模式的升级版,属于创建型设计模式。其目的是提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类,从而可以使应用程序在不指定具体类的情况下,创建一系列相关对象。
抽象工厂模式的角色
-
抽象工厂(AbstractFactory):它声明了一组用于创建不同产品的方法,这些方法返回抽象产品,是工厂方法的核心类,通常使用接口或抽象类实现,而每个具体工厂都继承了该接口或抽象类。
-
具体工厂(ConcreteFactory):它实现了抽象工厂接口,负责创建一个产品家族,例子中即为
AppleFactory
和SamsungFactory
。 -
抽象产品(AbstractProduct):它为每种产品声明接口,在该产品所对应的类中实现,例子中即为
Phone
和Computer
。 -
具体产品(ConcreteProduct):它定义具体工厂生产的具体产品,该产品只能由相应的具体工厂创建,例子中即为
IPhone
、IPad
、MacBook
和Notebook
。
Java示例
以抽象工厂模式创建手机和电脑为例,假设需要创建苹果品牌和三星品牌的手机和电脑,而这些手机和电脑又要求相互配合使用。我们首先定义抽象产品Phone
和Computer
:
// 抽象手机类
public interface Phone {
void run();
}
// 抽象电脑类
public interface Computer {
void execute();
}
然后定义具体产品IPhone
、IPad
、MacBook
和Notebook
,分别对应苹果品牌和三星品牌的手机和电脑:
// 苹果品牌手机
public class IPhone implements Phone {
@Override
public void run() {
System.out.println("IPhone run.");
}
}
// 苹果品牌电脑
public class MacBook implements Computer {
@Override
public void execute() {
System.out.println("MacBook execute.");
}
}
// 三星品牌手机
public class Notebook implements Computer {
@Override
public void execute() {
System.out.println("Notebook execute.");
}
}
// 三星品牌电脑
public class SamsungPhone implements Phone {
@Override
public void run() {
System.out.println("SamsungPhone run.");
}
}
接着定义抽象工厂AbstractFactory
,它包含生产手机和电脑的方法:
// 抽象工厂
public interface AbstractFactory {
Phone createPhone();
Computer createComputer();
}
然后定义具体品牌工厂类AppleFactory
和SamsungFactory
,分别用于创建苹果品牌和三星品牌的手机和电脑:
// 苹果品牌工厂
public class AppleFactory implements AbstractFactory {
@Override
public Phone createPhone() {
return new IPhone();
}
@Override
public Computer createComputer() {
return new MacBook();
}
}
// 三星品牌工厂
public class SamsungFactory implements AbstractFactory {
@Override
public Phone createPhone() {
return new SamsungPhone();
}
@Override
public Computer createComputer() {
return new Notebook();
}
}
最后,在客户端代码中,我们利用抽象工厂分别创建苹果品牌和三星品牌的手机和电脑:
// 创建苹果品牌手机和电脑
AbstractFactory appleFactory = new AppleFactory();
Phone iphone = appleFactory.createPhone();
Computer macbook = appleFactory.createComputer();
iphone.run();
macbook.execute();
// 创建三星品牌手机和电脑
AbstractFactory samsungFactory = new SamsungFactory();
Phone samsungPhone = samsungFactory.createPhone();
Computer notebook = samsungFactory.createComputer();
samsungPhone.run();
notebook.execute();
这样就完成了抽象工厂模式的Java演示。
优点和缺点
优点:
- 抽象工厂模式分离了具体类的生产,使得客户端不必对具体的产品进行关联,降低了客户端使用不同种类产品的复杂度;
- 抽象工厂模式使得客户端不必知道具体工厂类,只需要知道抽象工厂即可,降低了客户端与具体实现类之间的耦合度;
- 抽象工厂模式增加新品牌或产品变得容易,只需要增加相应的工厂和产品类即可,符合“开放-关闭原则”。
缺点:
- 抽象工厂模式的扩展性受到工厂方法模式的影响,可扩展性不是很灵活,因此当需要增加新的产品系列时,需要修改抽象工厂的接口,这需要同时修改所有的实现类,与“开放-关闭原则”有冲突;
- 抽象工厂模式的复杂度比较高,对于小规模的项目,不如简单工厂模式或工厂方法模式实用。
综上所述,抽象工厂模式能够为系统提供更高层次的抽象化,可以满足不同的客户端请求,从而提高系统的灵活性和可维护性。但是,也需要在具体使用时根据实际需要进行选择,遵循相应的规范和要求,才能发挥出抽象工厂模式的优点。
- 本文链接: http://maltose.top/archives/23-zhong-she-ji-mo-shi---chou-xiang-gong-chang-mo-shi
- 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!