抽象工厂

定义

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

类型

创建型

特点

  1. 客户端不依赖于产品类实例如何被创建、实现等细节。
  2. 强调一系列相关的产品对象,一起使用创建对象需要大量的重复代码。
  3. 提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于具体实现

优点

  1. 具体产品在应用层代码隔离,无需关心创建细节。
  2. 将一个系列的产品族统一到一起的创建

缺点

  1. 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口
  2. 增加了系统的抽象性和系统结构

抽象工厂

产品族:海尔洗衣机、海尔冰箱、海尔空调
产品等级结构:海尔洗衣机、TCL洗衣机、格力洗衣机

Coding

public interface CourseFactory {

    Video getVideo();
    Article getArticle();

}
public abstract class Video {

    public abstract void produce();

}
public abstract class Article {

    public abstract void produce();

}
public class JavaCourseFactory implements CourseFactory{
    @Override
    public Video getVideo() {
        return new JavaVideo();
    }

    @Override
    public Article getArticle() {
        return new JavaArticle();
    }
}
public class JavaVideo extends Video {
    @Override
    public void produce() {
        System.out.println("录制Java");
    }
}
public class JavaArticle extends Article{
    @Override
    public void produce() {
        System.out.println("Java 手记");
    }
}
public class PythonCourseFactory implements CourseFactory {
    @Override
    public Video getVideo() {
        return new PythonVideo();
    }

    @Override
    public Article getArticle() {
        return new PythonArticle();
    }
}
public class PythonVideo extends Video {
    @Override
    public void produce() {
        System.out.println("python 视频");
    }
}
public class PythonArticle extends Article {
    @Override
    public void produce() {
        System.out.println("Python 手记");
    }
}
public class Test {

    public static void main(String[] args) {
        // 主要强调产品族的概念
        // 应用层代码不和具体产品发生依赖,只与产品组工厂发生依赖关系
        CourseFactory courseFactory = new JavaCourseFactory();
        Video video = courseFactory.getVideo();
        Article article = courseFactory.getArticle();
        video.produce();
        article.produce();
    }

}

工厂方法关注产品等级结构,抽象工厂关注产品族
抽象工厂中,从具体产品族工厂取出来的,肯定属于同一产品族。可扩展性好,如新增前端产品族时,只要添加前端产品工厂和具体产品即可,符合开闭原则。

但新增产品等级比较麻烦,如果为现有产品族添加新的产品等级时,就不符合开闭原则。比如现在对每个课程除了视频、手记,还需要添加源码,则此时需要修改课程工厂,及它的各个具体实现

因此,对于产品等级结构相对固定的,且需要多个产品组合到一起形成产品族的业务场景时。推荐使用抽象工厂。

上一篇:AliOS Things SIG BLE Mesh网络的介绍和搭建


下一篇:Tsukinai的第六十四个程序(保号出圈//约瑟夫问题)