抽象工厂模式
-
定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类
-
适用场景:
- 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
- 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码
- 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现
UML类图
1、产品接口
手机
package com.lan.factory.abstract1;
//手机产品接口
public interface IphonProduct {
void start();
void shutdown();
void callup();
void sendSMS();
}
路由器
package com.lan.factory.abstract1;
//路由器产品接口
public interface IRouterProduct {
void start();
void shudown();
void openWife();
void setting();
}
抽象产品工厂
package com.lan.factory.abstract1;
//抽象产品工厂
public interface IProductFactory {
//生产手机
IphonProduct iphoneProduct();
//生产路由器
IRouterProduct routerProduct();
}
2、继承接口
2.1、小米系列
小米手机类 继承 手机接口
package com.lan.factory.abstract1;
//小米手机
public class XiaomiPhone implements IphonProduct {
@Override
public void start() {
System.out.println("开启小米手机");
}
@Override
public void shutdown() {
System.out.println("关闭小米手机");
}
@Override
public void callup() {
System.out.println("小米手机打电话");
}
@Override
public void sendSMS() {
System.out.println("小米手机发短信");
}
}
小米路由器类 继承 路由器接口
package com.lan.factory.abstract1;
//小米路由器
public class XiaomiRouter implements IRouterProduct {
@Override
public void start() {
System.out.println("启动小米路由器");
}
@Override
public void shudown() {
System.out.println("关闭小米路由器");
}
@Override
public void openWife() {
System.out.println("打开小米Wife");
}
@Override
public void setting() {
System.out.println("小米设置");
}
}
2.2、华为系列
华为手机类 继承 手机接口
package com.lan.factory.abstract1;
//华为手机
public class HuanweiPhone implements IphonProduct {
@Override
public void start() {
System.out.println("开启华为手机");
}
@Override
public void shutdown() {
System.out.println("关闭华为手机");
}
@Override
public void callup() {
System.out.println("华为手机打电话");
}
@Override
public void sendSMS() {
System.out.println("华为手机发短信");
}
}
华为路由器类 继承 路由器接口
package com.lan.factory.abstract1;
//华为工厂
public class HuaweiFactory implements IProductFactory {
//华为手机
@Override
public IphonProduct iphoneProduct() {
return new HuanweiPhone();
}
//华为路由器
@Override
public IRouterProduct routerProduct() {
return new HuaweiRouter();
}
}
3、测试
package com.lan.factory.abstract1;
public class Client {
public static void main(String[] args) {
System.out.println("===================小米系列产品===================");
//小米工厂
XiaomiFactory xiaomiFactory = new XiaomiFactory();
IphonProduct iphonProduct = xiaomiFactory.iphoneProduct();
iphonProduct.callup(); //小米手机打电话
iphonProduct.sendSMS();//小米手机发短信
IRouterProduct iRouterProduct = xiaomiFactory.routerProduct();
iRouterProduct.openWife();//打开小米Wife
iRouterProduct.setting();// 小米设置
System.out.println("===================华为系列产品===================");
//华为工厂
HuaweiFactory huaweiFactory = new HuaweiFactory();
//手机
IphonProduct iphonProduct1 = huaweiFactory.iphoneProduct();
iphonProduct1.shutdown();//关闭华为手机
iphonProduct1.callup();//华为手机打电话
//路由器
IRouterProduct iRouterProduct1 = huaweiFactory.routerProduct();
iRouterProduct1.setting();//华为设置
iRouterProduct1.openWife();// 打开华为Wife
}
}
4、优缺点
- 优点:
- 具体产品在应用层的代码隔离,无需关心创建的细节
- 将一个系列的产品统一到一起创建
- 缺点:
- 规定了所有可能被创建的产品集合,产品簇中扩展新产品困难
- 增加了系统的抽象性和理解难度