抽象工厂方法模式角色:
- 抽象工厂(AbstractFactory)角色 :是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
- 具体工厂类(ConreteFactory)角色 :这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建某一种产品对象。
- 抽象产品(Abstract Product)角色 :工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
- 具体产品(Concrete Product)角色 :抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。在抽象工厂中创建的产品属于同一产品族,这不同于工厂模式中的工厂只创建单一产品,。
抽象工厂模式与工厂方法模式的区别?
抽象工厂是生产创建一组相关或者相互依赖的产品对象,这些产品对象必须相互是有关系或有依赖的,而工厂方法中的工厂是生产单一产品对象的工厂。
学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级。
所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族
抽象工厂模式所提供的一系列产品就组成一个产品族;
而工厂方法提供的一系列产品称为一个等级结构。
拿手机的例子来说明他们之间的区别:比如华为P30的运行内存、机身内存、电池容量组成一个产品族和小米10的运行内存、机身内存、电池容量产品族,而这两个产品族都来自三个产品等级:运行内存、机身内存、电池容量
代码语言:javascript复制package com.example.abstractfactory;
public interface IHuawei {
void show();
}
代码语言:javascript复制package com.example.abstractfactory;
public interface IXiaomi {
void show();
}
代码语言:javascript复制package com.example.abstractfactory;
public class HuaWeiP30 implements IHuawei {
@Override
public void show() {
System.out.println("我是华为p30");
}
}
代码语言:javascript复制package com.example.abstractfactory;
public class XiaoMi10 implements IXiaomi {
@Override
public void show() {
System.out.println("我是小米10");
}
}
代码语言:javascript复制package com.example.abstractfactory;
public interface IFactory {
IHuawei createHuaWei();
IXiaomi createXiaoMi();
}
代码语言:javascript复制package com.example.abstractfactory;
public class Factory implements IFactory{
@Override
public IHuawei createHuaWei() {
return new HuaWeiP30();
}
@Override
public IXiaomi createXiaoMi() {
return new XiaoMi10();
}
}
代码语言:javascript复制package com.example.abstractfactory;
public class Test {
public static void main(String[] args) {
IFactory factory = new Factory();
factory.createHuaWei().show();
factory.createXiaoMi().show();
}
}
抽象工厂模式的优点
- 分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
- 使切换产品族变得容易
因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从huawei系列到xiaomi系列只需要切换一下具体工厂。
抽象工厂模式的缺点
- 不太容易扩展新的产品
如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。