欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式之工厂方法模式

程序员文章站 2024-01-10 08:41:34
...

定义

定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。

类型

创建型

适用场景

①、创建对象需要大量重复的代码。
②、应用层不依赖于产品类实例如何被创建、实现等细节。、
③、一个类通过其子类来指定创建哪个对象。

优缺点

优点:
①、用户只需要关心所需产品对应的工厂,无须关心创建细节。
②、加入新产品符合开闭原则,提高扩展性。

缺点:
①、类的个数容易过多,增加复杂度。
②、增加了系统的抽象性和理解难度。

代码实现

案例:书的工厂生产具体的书籍。
首先,声明一个生产书的工厂类。

public abstract class BookFactory {

    public abstract Book getBook();
}

这个类声明为抽象类,具体创建哪一个类型的书籍,由子类来决定。
接着创建一个Java书籍的工厂,实现BookFactory

public class JavaBookFactory extends BookFactory {

    @Override
    public Book getBook() {
        return new JavaBook();
    }
}

然后创建一个Python书籍的工厂,实现BookFactory

public class PythonBookFactory extends BookFactory {
    @Override
    public Book getBook() {
        return new PythonBook();
    }
}

上面的方法返回了一个Book对象,Java的书、Python的书、其他书等等,都属于同一个产品等级,都是书籍。相同类型的一个产品,称之为产品等级,这里书就是一个产品等级。
所以,首先声明一个书籍的抽象类。

public abstract class Book {

    /**
     * //TODO 记录的功能
     *
     * @param
     * @return void
     */
    public abstract void takeNotes();
}

然后创建具体的实现

public class JavaBook extends Book {

    @Override
    public void takeNotes() {
        System.out.println("记录java知识的书籍");
    }
}
public class PythonBook extends Book {

    @Override
    public void takeNotes() {
        System.out.println("记录python知识的书籍");
    }
}

最后写一个测试类

    @Test
    public void test1(){
        BookFactory factory = new JavaBookFactory();
        Book book = factory.getBook();
        book.takeNotes();
    }

这里对比之前讲到的简单工厂,可以清楚的看到,具体产生什么样的书籍,是由其工厂的子类来决定,而不是由以前的BookFactory来决定,这里BookFactory只定义规范和契约,并不决定产生哪一种类的书籍。

相关源码

1. Collection中的iterator
2. URLStreamHandlerFactory
3. slf4j中的LoggerFactory.getLogger()  

参考链接
https://coding.imooc.com/learn/list/270.html

相关标签: 工厂方法