Java 抽象工厂模式

Posted 追梦者丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 抽象工厂模式相关的知识,希望对你有一定的参考价值。

抽象工厂

定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类。

为了能更好理解抽象工厂模式,举个例子:

手机有小米手机、华为手机、苹果手机....,这些具体的手机和抽象手机就构成了一个产品等级结构。

同样的,路由器有小米路由器,华为路由器,这些具体的路由器和抽象路由器就构成了另一个产品等级结构,实质

产品等级结构即产品的继承结构(相当于实现了同一个接口的实现类)。小米手机位于手机产品等级结构中,小米路由器位于路由器的产品等级结构中

,而小米手机和小米路由器都是小米公司生产的,这样就构成了一个产品族,同理华为手机和华为路由器也构成了一个产品族。

重点:产品族中的产品都是由同一个工厂生产的,位于不同的产品等级结构。

抽象工厂是针对产品族。

优点:

  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 抽象工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

JAVA设计模式--抽象工厂模式

Java设计模式图文代码案例详解Java五大创建者模式 建造者原型(抽象)工厂单例模式

抽象工厂模式(JAVA反射)

大话设计模式-抽象工厂模式(大鸟和小菜Java版)

java抽象工厂的使用意图是啥?

JAVA设计模式——抽象工厂模式案例实现