抽象工厂:围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。
定义
抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们具体的类。
使用场景
优点
缺点
如何实现
1、定义抽象产品类
package factory.abstractfactory.product;
/**
* @Date 2020/5/23 上午10:33
* @Created by zhaoli
* 手机抽象类
*/
public interface IPhoneProduct {
void start();
void shutDown();
void call();
void sendSMS();
}
package factory.abstractfactory.product;
/**
* @Date 2020/5/23 上午10:33
* @Created by zhaoli
* 路由器抽象类
*/
public interface IRouterProduct {
void start();
void shutDown();
void open();
}
2、具体产品类实现
package factory.abstractfactory.product.impl;
import factory.abstractfactory.product.IPhoneProduct;
/**
* @Date 2020/5/23 上午10:36
* @Created by zhaoli
* 华为手机类
*/
public class HuaweiPhone implements IPhoneProduct {
@Override
public void start() {
System.out.println("华为手机开机");
}
@Override
public void shutDown() {
System.out.println("华为手机关机");
}
@Override
public void call() {
System.out.println("华为手机打电话");
}
@Override
public void sendSMS() {
System.out.println("华为手机发短信");
}
}
package factory.abstractfactory.product.impl;
import factory.abstractfactory.product.IRouterProduct;
/**
* @Date 2020/5/23 上午10:38
* @Created by zhaoli
* 华为路由器类
*/
public class HuaweiRouter implements IRouterProduct {
@Override
public void start() {
System.out.println("华为路由器打开");
}
@Override
public void shutDown() {
System.out.println("华为路由器关闭");
}
@Override
public void open() {
System.out.println("华为路由器打开wifi");
}
}
package factory.abstractfactory.product.impl;
import factory.abstractfactory.product.IPhoneProduct;
/**
* @Date 2020/5/23 上午10:36
* @Created by zhaoli
* 小米手机类
*/
public class XiaomiPhone implements IPhoneProduct {
@Override
public void start() {
System.out.println("小米手机开机");
}
@Override
public void shutDown() {
System.out.println("小米手机关机");
}
@Override
public void call() {
System.out.println("小米手机打电话");
}
@Override
public void sendSMS() {
System.out.println("小米手机发短信");
}
}
package factory.abstractfactory.product.impl;
import factory.abstractfactory.product.IRouterProduct;
/**
* @Date 2020/5/23 上午10:38
* @Created by zhaoli
* 小米路由器类
*/
public class XiaomiRouter implements IRouterProduct {
@Override
public void start() {
System.out.println("小米路由器打开");
}
@Override
public void shutDown() {
System.out.println("小米路由器关闭");
}
@Override
public void open() {
System.out.println("小米路由器打开wifi");
}
}
3、创建抽象工厂
package factory.abstractfactory.factory;
import factory.abstractfactory.product.IPhoneProduct;
import factory.abstractfactory.product.IRouterProduct;
/**
* @Date 2020/5/23 上午10:39
* @Created by zhaoli
* 抽象工厂,定义生产那些产品,具体实现由子类实现
*/
public interface IFactory {
IPhoneProduct getPhone();
IRouterProduct getRouter();
}
3、具体工厂实现
package factory.abstractfactory.factory.impl;
import factory.abstractfactory.factory.IFactory;
import factory.abstractfactory.product.IPhoneProduct;
import factory.abstractfactory.product.IRouterProduct;
import factory.abstractfactory.product.impl.HuaweiPhone;
import factory.abstractfactory.product.impl.HuaweiRouter;
import factory.abstractfactory.product.impl.XiaomiPhone;
import factory.abstractfactory.product.impl.XiaomiRouter;
/**
* @Date 2020/5/23 上午10:40
* @Created by zhaoli
* 华为工厂
*/
public class HuaweiFactory implements IFactory {
@Override
public IPhoneProduct getPhone() {
return new HuaweiPhone();
}
@Override
public IRouterProduct getRouter() {
return new HuaweiRouter();
}
}
package factory.abstractfactory.factory.impl;
import factory.abstractfactory.factory.IFactory;
import factory.abstractfactory.product.IPhoneProduct;
import factory.abstractfactory.product.IRouterProduct;
import factory.abstractfactory.product.impl.XiaomiPhone;
import factory.abstractfactory.product.impl.XiaomiRouter;
/**
* @Date 2020/5/23 上午10:40
* @Created by zhaoli
* 小米工厂
*/
public class XiaomiFactory implements IFactory {
@Override
public IPhoneProduct getPhone() {
return new XiaomiPhone();
}
@Override
public IRouterProduct getRouter() {
return new XiaomiRouter();
}
}
4、客户端实现
package factory.abstractfactory;
import factory.abstractfactory.factory.impl.HuaweiFactory;
import factory.abstractfactory.factory.impl.XiaomiFactory;
import factory.abstractfactory.product.IPhoneProduct;
import factory.abstractfactory.product.IRouterProduct;
import factory.abstractfactory.product.impl.HuaweiPhone;
/**
* @Date 2020/5/23 上午10:42
* @Created by zhaoli
*/
public class Client {
public static void main(String[] args) {
System.out.println("============小米系列产品=================");
IPhoneProduct phone = new XiaomiFactory().getPhone();
phone.start();
phone.sendSMS();
IRouterProduct router = new XiaomiFactory().getRouter();
router.start();
router.open();
System.out.println("============华为系列产品=================");
phone = new HuaweiFactory().getPhone();
phone.start();
phone.sendSMS();
router = new XiaomiFactory().getRouter();
router.start();
router.open();
}
}
5、运行结果