创建型模式-抽象工厂模式
抽象工厂模式
定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类
工厂方法模式(多工厂类型)类似于如下:
这个时候如果要再添加路由器,则如下:
如果再添加更多的产品则与上面两种类似,都要添加相同数量的类。
这两个图中可以提取出相同的两个抽象概念:品牌,产品类型。在抽象工厂模式中类似于同一品牌的产品称为产品族,产品类型不同称为产品等级。
抽象工厂模式:
代码实现
手机产品抽象接口
public interface IphoneProduct {
/**
* 开机
*/
void start();
/**
* 关机
*/
void shutdown();
/**
* 发送短信
*/
void sendSms();
/**
* 打电话
*/
void call();
}
路由器产品抽象
public interface IRouterProduct {
/**
* 开机
*/
void start();
/**
* 关机
*/
void shutdown();
/**
* 打开wifi
*/
void openWifi();
}
华为手机产品与华为路由器产品实现
华为手机
public class HuaweiPhone implements IphoneProduct{
@Override
public void start() {
System.out.println("华为手机开机");
}
@Override
public void shutdown() {
System.out.println("华为手机关机");
}
@Override
public void sendSms() {
System.out.println("华为手机发送短信");
}
@Override
public void call() {
System.out.println("华为手机打电话");
}
}
华为路由器
public class HuaweiRouter implements IRouterProduct{
@Override
public void start() {
System.out.println("华为路由器开机");
}
@Override
public void shutdown() {
System.out.println("华为路由器关机");
}
@Override
public void openWifi() {
System.out.println("华为路由器打开wifi");
}
}
小米手机产品与路由器产品实现
小米手机
public class XiaomiPhone implements IphoneProduct{
@Override
public void start() {
System.out.println("小米手机开机");
}
@Override
public void shutdown() {
System.out.println("小米手机关机");
}
@Override
public void sendSms() {
System.out.println("小米手机发送短信");
}
@Override
public void call() {
System.out.println("小米手机打电话");
}
}
小米路由器
public class XiaomiRouter implements IRouterProduct{
@Override
public void start() {
System.out.println("小米路由器开机");
}
@Override
public void shutdown() {
System.out.println("小米路由器关机");
}
@Override
public void openWifi() {
System.out.println("小米路由器打开wifi");
}
}
抽象产品工厂
public interface IProductFactory {
IphoneProduct createPhone();
IRouterProduct createRouter();
}
华为产品工厂实现
public class HuaweiFactory implements IProductFactory{
@Override
public IphoneProduct createPhone() {
return new HuaweiPhone();
}
@Override
public IRouterProduct createRouter() {
return new HuaweiRouter();
}
}
小米产品工厂实现
public class XiaomiFactory implements IProductFactory{
@Override
public IphoneProduct createPhone() {
return new XiaomiPhone();
}
@Override
public IRouterProduct createRouter() {
return new XiaomiRouter();
}
}
抽象工厂模式将多个系列不同等级产品交给各个系列工厂去创建,每个工厂创建各自的不同的产品。
工厂方法模式将多个系列同一等级产品交给各个工厂去创建。
抽象工厂模式:
- 增加产品需要修改抽象产品工厂,违反了开闭原则,适合产品类型稳定,不会频繁增加。
- 适合增加产品族,只需要创建对应的工厂即可。
工厂方法模式
- 增加产品需要增加抽象工厂类以及多个具体产品工厂类,每个具体产品工厂类负责创建产品