抽象工厂模式:
围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂----不可以增加产品,可以增加产品族提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类 我的理解: 抽象工厂定义了许多产品(即规定了可以创建哪些产品),每一种产品都是一个的接口,里面规定了每一个产品的功能(他告诉我们这个产品可以做什么) 每一个具体工厂都实现了抽象工厂(即告诉我们这个工厂可以产生的本工厂产品有哪些) 而每一个具体工厂生产的产品都实现了 产品这个接口(即实现这个产品的具体功能)
无论何种工厂模式,本质都是:
核心本质:实例化对象不直接使用new,而是调用工厂方法生成对象(工厂来new) 将选择实现类、创建对象统一管理和控制。从而将调用者和实现类解耦。 ProductFactory: 提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类(告诉你能干什么,下面的实现是怎么干) 客户端(应用层)不依赖于产品类实列如何被创建、实现等细节 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码. 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖具体实现 优点:具体产品在应用层的代码隔离,无需关心创建的细节 将同一个系列产品统一到一起创建 缺点:规定所有可能被创建的产品集合,产品簇中扩展新的产品困难 增加了系统的抽象性和理解难度
抽象工厂的UML类图:
角色分析:
-
抽象产品 (Abstract Product) 为构成系列产品的一组不同但相关的产品声明接口。
-
具体产品 (Concrete Product) 是抽象产品的多种不同类型实现。 所有变体 都必须实现相应的抽象产品。
-
抽象工厂 (Abstract Factory) 接口声明了一组创建各种抽象产品的方法。
-
具体工厂 (Concrete Factory) 实现抽象工厂的构建方法。 每个具体工厂都对应特定产品变体, 且仅创建此种产品变体。
- 客户端 (Client) 只需通过抽象接口调用工厂和产品对象, 就能与任何具体工厂/产品变体交互。
下面以一个创建小米、华为的手机和路由器的例子来解释抽象工厂:
小米手机 华为手机 属于同一个产品等级结构 小米路由器 华为路由器 属于同一个产品等级结构 同一产品簇 同一产品簇
产品工厂
ProductFactory接口
//核心,抽象产品
public interface ProductFactory {
//生产手机
PhoneProduct phoneProduct();
//生产路由器
RouterProduct routerProduct();
}
PhoneProduct接口
//手机产品接口
public interface PhoneProduct {
void start();
void shutdown();
void sendMsg();
void callUp();
}
RouterProduct接口
//路由器产品接口
public interface RouterProduct {
void start();
void shutdown();
void openWifi();
void setting();
}
华为工厂类
public class HWFactory implements ProductFactory{
@Override
public PhoneProduct phoneProduct() {
return new HWPhone();
}
@Override
public RouterProduct routerProduct() {
return new HWRouter();
}
}
小米工厂类
public class XMFactory implements ProductFactory{
@Override
public PhoneProduct phoneProduct() {
return new XMPhone();
}
@Override
public RouterProduct routerProduct() {
return new XMRouter();
}
}
华为手机产品类
public class HWPhone implements PhoneProduct{
@Override
public void start() {
System.out.println("开启华为手机");
}
@Override
public void shutdown() {
System.out.println("关闭华为手机");
}
@Override
public void sendMsg() {
System.out.println("华为发短信");
}
@Override
public void callUp() {
System.out.println("华为打电话");
}
}
华为路由器产品类
public class HWRouter implements RouterProduct{
@Override
public void start() {
System.out.println("开启华为路由器");
}
@Override
public void shutdown() {
System.out.println("关闭华为路由器");
}
@Override
public void openWifi() {
System.out.println("打开华为WIFI");
}
@Override
public void setting() {
System.out.println("华为设置");
}
}
小米手机产品类
public class XMPhone implements PhoneProduct{
@Override
public void start() {
System.out.println("开启小米手机");
}
@Override
public void shutdown() {
System.out.println("关闭小米手机");
}
@Override
public void sendMsg() {
System.out.println("小米发短信");
}
@Override
public void callUp() {
System.out.println("小米打电话");
}
}
小米路由器产品类
public class XMRouter implements RouterProduct{
@Override
public void start() {
System.out.println("开启小米路由器");
}
@Override
public void shutdown() {
System.out.println("关闭小米路由器");
}
@Override
public void openWifi() {
System.out.println("打开小米WIFI");
}
@Override
public void setting() {
System.out.println("小米设置");
}
}
客户端
public class Client {
public static void main(String[] args) {
System.out.println("======小米系类产品=======");
//创建小米工厂
XMFactory xmFactory = new XMFactory();
//小米工厂生产手机
PhoneProduct phoneProduct = xmFactory.phoneProduct();
//使用小米手机
phoneProduct.start();
phoneProduct.sendMsg();
//小米工厂生产路由器
RouterProduct routerProduct = xmFactory.routerProduct();
//使用小米路由器
routerProduct.start();
routerProduct.openWifi();
System.out.println("======华为系类产品=======");
//创建华为工厂
HWFactory hwFactory = new HWFactory();
//华为工厂生产手机
phoneProduct = hwFactory.phoneProduct();
//使用华为手机
phoneProduct.start();
phoneProduct.sendMsg();
//华为工厂生产路由器
routerProduct = hwFactory.routerProduct();
//使用华为路由器
routerProduct.start();
routerProduct.openWifi();
}
}
总结:
-
以不同的产品类型与产品变体为维度绘制矩阵。(找出产品簇和同等级结构产品)
-
为所有产品声明抽象产品接口。 然后让所有具体产品类实现这些接口。
-
声明抽象工厂接口, 并且在接口中为所有抽象产品提供一组构建方法。
-
为每种产品变体实现一个具体工厂类。
-
在应用程序中开发初始化代码。 该代码根据应用程序配置或当前环境, 对特定具体工厂类进行初始化。 然后将该工厂对象传递给所有需要创建产品的类。
-
找出代码中所有对产品构造函数的直接调用, 将其替换为对工厂对象中相应构建方法的调用。