上一篇:工厂模式
1.什么是抽象工厂模式?
在上一篇文章中我们也说到,抽象工厂模式
可以说是一个超级工厂,可以通过超级工厂来创建其他的工厂。在抽象工厂模式
中,接口是负责创建一个相关对象的工厂,无需指定他们具体的类,每个生成的工厂都可以按照工厂模式来创建对象。
1.什么时候使用抽象工厂模式?
系统的产品有多个产品族,而我们只需要消费其中某一个产品族中的产品。什么是产品族?
以手机为例:
3.如何实现抽象工厂模式?
1)定义手机接口
/**
* 定义 手机 接口
*/
public interface Phone {
//定义手机功能
/**
* 开机
*/
void boot();
/**
* 关机
*/
void shutdown();
/**
* 发短信
*/
void sendMessage();
}
2)定义路由器接口
/**
* 定义 路由器 接口
*/
public interface Router {
//定义路由器功能
/**
* 开机
*/
void boot();
/**
* 关机
*/
void shutdown();
/**
* 打开wifi
*/
void openwifi();
}
3)定义小米手机类
此类是小米手机的具体实现
/**
* 定义小米手机类
*/
public class XiaomiPhone implements Phone {
@Override
public void boot() {
System.out.println("开启小米手机");
}
@Override
public void shutdown() {
System.out.println("小米手机关机");
}
@Override
public void sendMessage() {
System.out.println("小米手机发送短信");
}
}
4)定义小米路由器
此类是小米路由器具体实现类。
/**
* 定义小米路由器类
*/
public class XiaomiRouter implements Router {
@Override
public void boot() {
System.out.println("开启小米路由器");
}
@Override
public void shutdown() {
System.out.println("关闭小米路由器");
}
@Override
public void openwifi() {
System.out.println("小米路由器打开wifi");
}
}
5)定义华为手机类
此类是华为手机的具体实现类
/**
* 定义华为手机类
*/
public class HuaweiPhone implements Phone {
@Override
public void boot() {
System.out.println("开启华为手机");
}
@Override
public void shutdown() {
System.out.println("华为手机关机");
}
@Override
public void sendMessage() {
System.out.println("华为手机发送短信");
}
}
6)定义华为路由器类
此类是华为路由器的具体实现类
/**
* 定义华为路由器类
*/
public class HuaweiRouter implements Router {
@Override
public void boot() {
System.out.println("开启华为路由器");
}
@Override
public void shutdown() {
System.out.println("关闭华为路由器");
}
@Override
public void openwifi() {
System.out.println("华为路由器打开wifi");
}
}
7)定义抽象工厂类
/**
* 定义 抽象 工厂类
*/
public interface AbstractFactory {
/**
* 生产手机
*/
Phone productPhone();
/**
* 生产路由器
*/
Router productRouter();
}
8)定义小米工厂
/**
* 定义小米工厂
*/
public class XiaomiFactory implements AbstractFactory {
@Override
public Phone productPhone() {
return new XiaomiPhone();
}
@Override
public Router productRouter() {
return new XiaomiRouter();
}
}
9)定义华为工厂
/**
* 定义华为工厂
*/
public class HuaweiFactory implements AbstractFactory {
@Override
public Phone productPhone() {
return new HuaweiPhone();
}
@Override
public Router productRouter() {
return new HuaweiRouter();
}
}
10)编写测试类
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
//创建一个小米工厂
XiaomiFactory xiaomiFactory = new XiaomiFactory();
//小米工厂生产小米手机,获取小米手机对象
Phone phone = xiaomiFactory.productPhone();
//使用小米手机功能
phone.boot();
phone.sendMessage();
phone.shutdown();
/**
* 华为操作如上……
*/
}
}
11)运行结果
4.抽象工厂模式优缺点?
1)优点:
1.当一个产品族(小米、华为)被设计成一起工作时,此模式能够保证始终只使用其一种产品。
2.在使用的时候我们不需要去关心它实现的细节,直接找工厂拿就行。
2)缺点:
1.在工厂中就已经规定了生产哪些产品,扩展生产种类麻烦(如小米生产家电,那就需要修改工厂代码)
2.工厂模式本来挺easy的,但是这种模式更加抽象更加不容易搞懂。