抽象工厂

抽象工厂

概念:围绕一个超级工厂来创建其他工厂,该超级工厂又被称为其他工厂的工厂。

优点

  • 具体产品在应用层的代码隔离,无需创建细节
  • 将一系列的产品统一到一起创建

缺点

  • 规定了所有可能被创建的产品集合,产品族中拓展新的产品困难;
  • 增加了系统的抽象性和理解难度

UML类图

首先先看一下这张被使用了无数次的类图

再接着是这个上代码前的一个模型图。

第一要素:产品是固定的,很少会发生改变

代码案例

首先创建四个具体实现类

/**
 * 华为手机
 */
public class huaweiPhone implements IPhoneProduct{
    public void start() {
        System.out.println("华为开机");
    }

    public void shutdown() {
        System.out.println("华为关机");
    }

    public void callup() {
        System.out.println("华为打电话");
    }

    public void sendMsg() {
        System.out.println("华为发短信");
    }
}

华为路由器

public class huaweiRouter implements IRouterProduct{
    public void start() {
        System.out.println("华为路由器开机");
    }

    public void shutdown() {
        System.out.println("华为路由器关机");

    }
}

小米手机

/**
 * 小米手机
 */
public class xiaomiPhone implements IPhoneProduct{
    public void start() {
        System.out.println("小米开机");
    }

    public void shutdown() {
        System.out.println("小米关机");
    }

    public void callup() {
        System.out.println("小米打电话");
    }

    public void sendMsg() {
        System.out.println("小米发短信");
    }
}

小米路由器

public class xiaomirouter implements IRouterProduct{
    public void start() {
        System.out.println("启动小米路由器");
    }

    public void shutdown() {
        System.out.println("关闭小米路由器");
    }
}

根据上面的实现方法抽象出来两个接口,分别为:手机接口和路由器接口
手机接口

public interface IPhoneProduct {
    void start();
    void shutdown();
    void callup();
    void sendMsg();
}

路由器接口

public interface IRouterProduct {
    void start();
    void shutdown();
}

还可以根据上面的功能接口,抽象出来两个工厂类:小米工厂和华为工厂
小米工厂

public class xiaomiFactory implements IProductFactory{
    public IPhoneProduct iphoneProduct() {
        return new xiaomiPhone();
    }

    public IRouterProduct irouterProduct() {
        return new xiaomirouter();
    }
}

华为工厂

public class huaweiFactory implements IProductFactory{
    public IPhoneProduct iphoneProduct() {
        return new huaweiPhone();
    }

    public IRouterProduct irouterProduct() {
        return new huaweiRouter();
    }
}

将这个工厂进行抽象:产品接口

/**
 * 抽象工厂
 */
public interface IProductFactory {
    //生产手机

    IPhoneProduct iphoneProduct();

    //生产路由器
    IRouterProduct irouterProduct();
}

然后是进行测试

public class FactoryTest {

    public static void main(String[] args) {
        IProductFactory xiaomiFactory = new xiaomiFactory();

        IPhoneProduct iPhoneProduct = xiaomiFactory.iphoneProduct();
        iPhoneProduct.start();

        IProductFactory huaweiFactory = new huaweiFactory();
        
        IPhoneProduct iPhoneProduct1 = huaweiFactory.iphoneProduct();
        iPhoneProduct1.callup();
    }
}

注意:

这种方式在产品不会增加,或者预计增加不是特别频繁的时候可以使用。

posted @ 2021-07-16 23:04  King-DA  阅读(46)  评论(0)    收藏  举报