Java 抽象工厂模式

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

回到顶部