抽象工厂主要是创建一个工厂的工厂。
目的
提供一个创建一系列相关或者互相依赖对象的接口,而无需指定他们具体的类。
优点
- 具体代码在应用层的隔离,无需关心创建的细节
- 将产品统一到一起创建
缺点
- 难以支持新的铲平类别
- 增加了系统的抽象性
实现方式
- 将工厂作为单件,每个产品系列中只需要一个虚拟工厂的实列,因此可以将工厂创建为一个Singleton。
- 为每一个产品定义一个工厂方法。
abstract factory的例子
为了更好理解抽象工厂模式,需要先搞清楚产品等级和产品族的概念,举个粟子:手机有小米手机、华为手机,它们都是手机,这些具体的手机和抽象手机就构成了一个产品等级结构。同样的,路由器有小米路由器,华为路由器,这些具体的路由器和抽象路由器就构成了另外一个产品等级结构,实质上产品等级结构即产品的继承结构。小米手机位于手机产品等级结构中,小米路由器位于路由器的产品等级结构中,而小米手机和小米路由器都是小米公司生产的,就构成了一个产品族,同理,华为手机和华为路由器也构成了一个产品族 。划重点就是产品族中的产品都是由同一个工厂生产的,位于不同的产品等级结构
image.png
对比工厂方法,其针对的是产品等级结构,而抽象工厂是针对产品族。在二者的使用选择上,需要结合实际业务,对于产品等级数量相对固定的产品族,可以优先考虑抽象工厂模式,但是如果频繁变动,则不大适用,因为在现有的产品族中新增产品等级时,就需要修改产品族工厂,也就违背了开闭原则
引用自吴渣渣
代码
代码分析
一个abstract factory被XiaomiProductFactory和HuaweiProduct Factory两个工厂类实现。其实现方法和工厂方法一致。具体继承关系如下图:
image.png
代码实现
ProductFactory
类
/**
* 抽象工厂类
* 定义同一种类型的产品的生产
*/
public interface ProductFactory {
/**
* 生产手机
*/
PhoneProduct producePhone();
/**
* 生产电脑
*/
ComputerProduct produceComputer();
}
XiaomiProductFactory
类
public class XiaomiProductFactory implements ProductFactory {
@Override
public PhoneProduct producePhone(){
System.out.println("生产小米手机");
return new XiaomiPhone();
}
@Override
public ComputerProduct produceComputer(){
System.out.println("生产小米电脑");
return new XiaomiComputer();
}
}
HuaweiProductFactory
类
public class HuaweiProductFactory implements ProductFactory{
@Override
public PhoneProduct producePhone(){
System.out.println("生产华为手机");
return new HuaweiPhone();
}
@Override
public ComputerProduct produceComputer(){
System.out.println("生产华为电脑");
return new HuaweiComputer();
}
}
抽象产品类如下
PhoneProduct
类
public interface PhoneProduct {
void start();
void powerOff();
void call();
void sendMessage();
}
ComputerProduct
类
/**
* 电脑接口
*/
public interface ComputerProduct {
void start();
void powerOff();
void code();
}
产品实现类如下:
XiaomiPhone
public class XiaomiPhone implements PhoneProduct {
@Override
public void start(){
System.out.println("小米手机开机");
}
@Override
public void powerOff(){
System.out.println("小米手机关机");
}
@Override
public void call(){
System.out.println("小米手机打电话");
}
@Override
public void sendMessage(){
System.out.println("小米手机发送信息");
}
}
XiaomiComputer
public class XiaomiComputer implements ComputerProduct{
@Override
public void start(){
System.out.println("小米电脑开机");
}
@Override
public void powerOff(){
System.out.println("小米电脑关机");
}
@Override
public void code(){
System.out.println("小米电脑写代码");
}
}
HuaweiPhone
public class HuaweiPhone implements PhoneProduct {
@Override
public void start(){
System.out.println("华为手机开机");
}
@Override
public void powerOff(){
System.out.println("华为手机关机");
}
@Override
public void call(){
System.out.println("华为手机打电话");
}
@Override
public void sendMessage(){
System.out.println("华为手机发短信");
}
}
HuaweiComputer
public class HuaweiComputer implements ComputerProduct {
@Override
public void start(){
System.out.println("华为电脑开机");
}
@Override
public void powerOff(){
System.out.println("华为电脑关机");
}
@Override
public void code(){
System.out.println("华为电脑写代码");
}
}
网友评论