抽象工厂
定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类
优点:
- 具体产品在应用层的代码隔离,无需要关心创建的细节
- 将一个系列的产品统一到一起创建
缺点:
- 规定了所有可能被创建的产品集合,产品簇中扩展新的产品困难
- 增加了系统的抽象和理解难度
先来看一下抽象工厂的URL类图
下边我们通过一个例子来理解一下抽象工厂这个概念,有两家厂商分别是华为和vivo,它们都生产手机和路由器,我们就通过这两个产品来理解抽象工厂
先看一下各个类之间的关系
首先创建两个产品接口(IphoneProduct和IRouterProduct)
package com.zkw.factory.abstract1;
public interface IphoneProduct {
public void charge();
public void start();
public void shutdown();
public void call();
public void sendSMS();
}
package com.zkw.factory.abstract1;
public interface IRouterProduct {
public void start();
public void shutdown();
public void OpenWifi();
public void CloseWifi();
}
然后华为和vivo两个厂家分别实现这个两个产品的接口
package com.zkw.factory.abstract1;
public class HuaWeiIphone implements IphoneProduct{
@Override
public void charge() {
System.out.println("HuaWei手机充电");
}
@Override
public void start() {
System.out.println("HuaWei手机开机");
}
@Override
public void shutdown() {
System.out.println("HuaWei手机关机");
}
@Override
public void call() {
System.out.println("HuaWei手机打电话");
}
@Override
public void sendSMS() {
System.out.println("HuaWei手机发短信");
}
}
package com.zkw.factory.abstract1;
public class HuaWeiIRouter implements IRouterProduct {
@Override
public void start() {
System.out.println("HuaWei路由器开机");
}
@Override
public void shutdown() {
System.out.println("HuaWei路由器关机");
}
@Override
public void OpenWifi() {
System.out.println("HuaWei路由器打开WiFi");
}
@Override
public void CloseWifi() {
System.out.println("HuaWei路由器关闭WiFi");
}
}
package com.zkw.factory.abstract1;
public class vivoIphone implements IphoneProduct {
@Override
public void charge() {
System.out.println("vivo手机充电");
}
@Override
public void start() {
System.out.println("vivo手机开机");
}
@Override
public void shutdown() {
System.out.println("vivo手机关机");
}
@Override
public void call() {
System.out.println("vivo手机打电话");
}
@Override
public void sendSMS() {
System.out.println("vivo手机发短信");
}
}
package com.zkw.factory.abstract1;
public class viovoIRouter implements IRouterProduct {
@Override
public void start() {
System.out.println("vivo路由器开机");
}
@Override
public void shutdown() {
System.out.println("vivo路由器关机");
}
@Override
public void OpenWifi() {
System.out.println("vivo路由器打开WiFi");
}
@Override
public void CloseWifi() {
System.out.println("vivo路由器关闭WiFi");
}
}
创建件超级工厂,这个工厂主要提供创建产品的接口
package com.zkw.factory.abstract1;
public interface SuperFactory {
public IphoneProduct getIphoneProduct();
public IRouterProduct getIRouterProduct();
}
最后两家厂商的工厂分别实现这超级工厂
package com.zkw.factory.abstract1;
public class HUaWeiFactory implements SuperFactory {
@Override
public IphoneProduct getIphoneProduct() {
return new HuaWeiIphone();
}
@Override
public IRouterProduct getIRouterProduct() {
return new HuaWeiIRouter();
}
}
package com.zkw.factory.abstract1;
public class vivoFactory implements SuperFactory{
@Override
public IphoneProduct getIphoneProduct() {
return new vivoIphone();
}
@Override
public IRouterProduct getIRouterProduct() {
return new viovoIRouter();
}
}
测试代码
package com.zkw.factory.abstract1;
public class Customer {
public static void main(String[] args) {
System.out.println("========vivo系列产品=========");
vivoFactory vivoFactory = new vivoFactory();
IphoneProduct iphoneProduct = vivoFactory.getIphoneProduct();
System.out.println("====vivo手机产品====");
iphoneProduct.charge();
iphoneProduct.start();
iphoneProduct.shutdown();
iphoneProduct.call();
iphoneProduct.sendSMS();
System.out.println("====vivo路由器====");
IRouterProduct iRouterProduct = vivoFactory.getIRouterProduct();
iRouterProduct.start();
iRouterProduct.shutdown();
iRouterProduct.OpenWifi();
iRouterProduct.CloseWifi();
System.out.println("========HuaWei系列产品=========");
System.out.println("====HuaWei手机产品====");
HUaWeiFactory hUaWeiFactory = new HUaWeiFactory();
IphoneProduct iphoneProduct1 = hUaWeiFactory.getIphoneProduct();
iphoneProduct1.charge();
iphoneProduct1.start();
iphoneProduct1.shutdown();
iphoneProduct1.call();
iphoneProduct1.sendSMS();
System.out.println("====HuaWei路由器====");
IRouterProduct iRouterProduct1 = hUaWeiFactory.getIRouterProduct();
iRouterProduct1.start();
iRouterProduct1.shutdown();
iRouterProduct1.OpenWifi();
iRouterProduct1.CloseWifi();
}
}
结果如下