23天设计模式之抽象工厂模式

23天设计模式之抽象工厂模式

文章简介

《23天设计模式之抽象工厂模式》这是跟工厂模式相关的一篇文章,但是抽象工厂又是不同于工厂模式的,抽象工厂是围绕一个超级工厂去创建其它工厂,下面就一起来看看吧!

抽象工厂模式

定义

  • 属于创建型模式,用于产品族的构建。产品族指的是某个品牌下的不同系类产品,如华为下的手机、电视、电脑等系列合起来就是华为的产品族。

  • 抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。

  • 区别:工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。

    通俗理解就是:

    工厂方法模式中,有一个华为手机工厂类,这个工厂只能提供华为手机这一种产品,也就是只能提供华为手机,不能提供华为TV。

    而抽象工厂中,有一个华为工厂类,这个工厂既能提供华为手机,也能提供华为TV,也就是华为系列的所有产品都能提供。

    上文所指的产品系列指的是,华为手机是一个产品系列,华为TV是另一个产品系列。

  • 增加新产品必须修改原有代码,不符合开闭原则,增加新产品族不用修改原有代码。

角色

  • 抽象产品角色:描述产品有什么功能,一般用接口或抽象类表示。如 手机接口
  • 具体产品角色:实现抽象产品角色的类,是真实的产品。如 华为手机
  • 抽象工厂角色:描述产品族,表示具体工厂可以生产的所有产品。
  • 具体工厂角色:实现抽象工厂角色的类,用于客户端调用创建产品实例。

代码实现

  • 抽象产品角色
public interface Phone {
    void call();
    void send(String msg);
}

public interface TV {
    // 播放
    void play();
    // 选择频道
    void choose(int channel);
}
  • 具体产品角色
public class HuaweiPhone implements Phone{
    @Override
    public void call() {
        System.out.println("HuaweiPhone call...");
    }

    @Override
    public void send(String msg) {
        System.out.println("HuaweiPhone send... " + msg);
    }
}

public class HuaweiTV implements TV{
    @Override
    public void play() {
        System.out.println("HuaweiTV play...");
    }

    @Override
    public void choose(int channel) {
        System.out.println("HuaweiTV choose... " + channel);
    }
}

public class XiaomiPhone implements Phone{
    @Override
    public void call() {
        System.out.println("XiaomiPhone call...");
    }

    @Override
    public void send(String msg) {
        System.out.println("XiaomiPhone send... " + msg);
    }
}

public class XiaomiTV implements TV{
    @Override
    public void play() {
        System.out.println("XiaomiTV play...");
    }

    @Override
    public void choose(int channel) {
        System.out.println("XiaomiTV choose... " + channel);
    }
}
  • 抽象工厂角色
public interface AbstractFactory {
    Phone getPhone();
    TV getTV();
}
  • 具体工厂角色
public class HuaweiFactory implements AbstractFactory{
    @Override
    public Phone getPhone() {
        return new HuaweiPhone();
    }

    @Override
    public TV getTV() {
        return new HuaweiTV();
    }
}

public class XiaomiFactory implements AbstractFactory{
    @Override
    public Phone getPhone() {
        return new XiaomiPhone();
    }

    @Override
    public TV getTV() {
        return new XiaomiTV();
    }
}
  • 客户端测试
public class Client {
    public static void main(String[] args) {
        // 获得每个品牌的工厂
        HuaweiFactory huaweiFactory = new HuaweiFactory();
        XiaomiFactory xiaomiFactory = new XiaomiFactory();

        // 获取不同品牌的产品,可以发现,这里获取到的产品都使用了向上转型,客户可以通过抽象接口操纵实例
        Phone huaweiPhone = huaweiFactory.getPhone();
        Phone xiaomiPhone = xiaomiFactory.getPhone();
        TV huaweiTV = huaweiFactory.getTV();
        TV xiaomiTV = xiaomiFactory.getTV();

        huaweiPhone.call();
        huaweiPhone.send("Huawei 你好");
        xiaomiPhone.call();
        xiaomiPhone.send("Xiaomi 你好");

        huaweiTV.choose(1);
        huaweiTV.play();
        xiaomiTV.choose(2);
        xiaomiTV.play();
    }
}
HuaweiPhone call...
HuaweiPhone send... Huawei 你好
XiaomiPhone call...
XiaomiPhone send... Xiaomi 你好
HuaweiTV choose... 1
HuaweiTV play...
XiaomiTV choose... 2
XiaomiTV play...

Process finished with exit code 0

优缺点分析

  • 优点:

    1. 分离了具体的类。客户通过抽象接口操纵实例,产品的类名也在具体工厂的实现中被分离,它们不出现在客户代码中。
    2. 易于交换产品系列。一个具体工厂类只在初始化时出现一次,这使得改变一个应用的具体工厂变得很容易,只需改变具体的工厂即可使用不同的产品配置。
    3. 有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。
  • 缺点:

    1. 难以支持新种类的产品。因为抽象工厂接口确定了可以被创建的产品集合,所以难以扩展抽象工厂以生产新种类的产品。

以上

感谢您花时间阅读我的博客,以上就是我对抽象工厂模式的一些理解,若有不对之处,还望指正,期待与您交流。

本篇博文系原创,仅用于个人学习,转载请注明出处。

23天设计模式之抽象工厂模式

上一篇:centos7服务器配置git,并且从码云拉取代码


下一篇:记一次删除k8s namespace无法删除的问题