设计模式之工厂方法模式
程序员文章站
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()
上一篇: Excel 2007编写公式
下一篇: 求苹果purchase的验证php代码