Java 抽象工厂模式
抽象工厂
定义:工厂模式" title="抽象工厂模式">抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类。
为了能更好理解抽象工厂模式,举个例子:
手机有小米手机、华为手机、苹果手机....,这些具体的手机和抽象手机就构成了一个产品等级结构。
同样的,路由器有小米路由器,华为路由器,这些具体的路由器和抽象路由器就构成了另一个产品等级结构,实质
上产品等级结构即产品的继承结构(相当于实现了同一个接口的实现类)。小米手机位于手机产品等级结构中,小米路由器位于路由器的产品等级结构中
,而小米手机和小米路由器都是小米公司生产的,这样就构成了一个产品族,同理华为手机和华为路由器也构成了一个产品族。
重点:产品族中的产品都是由同一个工厂生产的,位于不同的产品等级结构。
抽象工厂是针对产品族。
优点:
1、无需关心创建的细节
2、将一个系列的产品统一到一起创建
示例:
定义手机产品接口
public interface Phone {//定义手机产品接口void start();//开机
void close();//关机
void sendOut();//发送信息
}
定义路由器产品接口
public interface Router {//定义路由器产品的接口void start();//开机
void close();//关机
void wifi();//开启wifi
}
定义小米手机和小米路由器的产品实现类。
public class XiaomiPhone implements Phone {// 手机产品接口的实现类 小米手机@Override
public void start() {
System.out.println("开启小米手机");
}
@Override
public void close() {
System.out.println("关闭小米手机");
}
@Override
public void sendOut() {
System.out.println("使用小米手机发短信");
}
}
public class XiaomiRouter implements Router {// 路由器产品接口的实现类 小米路由器@Override
public void start() {
System.out.println("开启小米路由器");
}
@Override
public void close() {
System.out.println("开闭小米路由器");
}
@Override
public void wifi() {
System.out.println("打开小米路由器的wifi功能");
}
}
定义华为手机和华为路由器的产品实现类。
public class HuaweiPhone implements Phone {// 手机产品接口的实现类 华为手机@Override
public void start() {
System.out.println("开启华为手机");
}
@Override
public void close() {
System.out.println("关闭华为手机");
}
@Override
public void sendOut() {
System.out.println("使用华为手机发短信");
}
}
public class HuaweiRouter implements Router { // 路由产品接口的实现类 华为路由器@Override
public void start() {
System.out.println("开启华为路由器");
}
@Override
public void close() {
System.out.println("开闭华为路由器");
}
@Override
public void wifi() {
System.out.println("打开华为路由器的wifi功能");
}
}
定义一个抽象工厂接口。(抽象产品族工厂)
public interface ProductFactory {//抽象产品工厂接口/**
* 生产手机
* */
Phone productPhone();
/**
* 生产路由器
* */
Router productRouter();
}
小米工厂和华为工厂实现类
public class XiaomiFactory implements ProductFactory {// 抽象工厂接口的实现类 --> 小米工厂类@Override
public Phone productPhone() {
System.out.println("-----------------------生产小米手机-----------------------");
return new XiaomiPhone();
}
@Override
public Router productRouter() {
System.out.println("-----------------------生产小米路由器-----------------------");
return new XiaomiRouter();
}
}
public class HuaweiFactory implements ProductFactory {// 抽象工厂接口的实现类 --> 华为工厂类@Override
public Phone productPhone() {
System.out.println("-----------------------生产华为手机-----------------------");
return new HuaweiPhone();
}
@Override
public Router productRouter() {
System.out.println("-----------------------生产华为路由器-----------------------");
return new HuaweiRouter();
}
}
客户端:
public class Test {public static void main(String[] args) {
System.out.println("=========================小米系列产品=========================");
//小米工厂实例
ProductFactory xiaofactory = new XiaomiFactory();
//小米手机
Phone xiaoPhone = xiaofactory.productPhone();
xiaoPhone.start();
xiaoPhone.sendOut();
xiaoPhone.close();
//小米路由器
Router xiaoRouter = xiaofactory.productRouter();
xiaoRouter.start();
xiaoRouter.wifi();
xiaoRouter.close();
System.out.println();
System.out.println();
System.out.println();
System.out.println("=========================华为系列产品=========================");
//华为工厂实例
ProductFactory huaweifactory = new HuaweiFactory();
//华为手机
Phone huaweiPhone = huaweifactory.productPhone();
huaweiPhone.start();
huaweiPhone.sendOut();
huaweiPhone.close();
//华为路由器
Router huaweiRouter= huaweifactory.productRouter();
huaweiRouter.start();
huaweiRouter.wifi();
huaweiRouter.close();
}
}
结果:
1 =========================小米系列产品=========================2 -----------------------生产小米手机-----------------------
3 开启小米手机
4 使用小米手机发短信
5 关闭小米手机
6 -----------------------生产小米路由器-----------------------
7 开启小米路由器
8 打开小米路由器的wifi功能
9 开闭小米路由器
10
11
12
13 =========================华为系列产品=========================
14 -----------------------生产华为手机-----------------------
15 开启华为手机
16 使用华为手机发短信
17 关闭华为手机
18 -----------------------生产华为路由器-----------------------
19 开启华为路由器
20 打开华为路由器的wifi功能
21 开闭华为路由器
抽象工厂模式的缺点:
1、规定了所有可能被创建的产品集合,产品族中扩展新的产品困难
2、增加了系统的抽象性和理解难度
代码示例地址:https://github.com/oukele/abstractFactory
以上是 Java 抽象工厂模式 的全部内容, 来源链接: utcz.com/z/390729.html