接着上一篇 设计模式之工厂模式—简单工厂模式 进一步学习工作方法模式;
工厂方法模式:指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化在子类中进行;
核心思想:单一职责的工厂类(JavaBookFactory),该类进行具体类的实例化(JavaBook类的实例化) ------实现------》一个总的工厂接口(BookFactory);
1、一个总的工厂接口:BookFactory
public interface BookFactory {
Book getBookInstance();
}
2、单一职责的工厂类:JavaBookFactory
public class JavaBookFactory implements BookFactory{
@Override
public Book getBookInstance() {
return new JavaBook();
}
}
3、书籍总接口:Book 其中方法为购买书籍:buyBook();子类实现该方法进行具体的购买行为
public interface Book {
public void buyBook();
}
4、需要实例化的类:JavaBook
public class JavaBook implements Book{
@Override
public void buyBook() {
System.out.println("购买java书籍");
}
}
5、测试:
public class MethodFactoryTest {
public static void main(String[] args) {
//通过new JavaBookFactory()来实例化工厂,得到JavaBookFactory实例
BookFactory bookFactory = new JavaBookFactory();
//实例通过调用getBookInstance()方式获取具体的实现类
Book book = bookFactory.getBookInstance();
book.buyBook();
}
}
结果打印:
6、总结:这就是工厂方法模式的实现,其主要核心就是一种类型只负责该类型的类的实例化工作,很好的贴合了单一原则,工厂方法模式也被认为是抽象工厂模式的一种特殊方式,下一篇将进行抽象工厂模式的学习;
工厂方法模式:
优点在于:
1、用户只需要关心所需产品对应的工厂,无需关心创建细节;
2、所有的具体工厂类都具有同一抽象父类,被称为多态工厂模式;
3、符合开闭原则,新增产品只需要添加工厂类和具体产品,无需修改代码,扩展性好;
缺点在于:
1、添加一个新的产品,系统都将增加一个产品类,并且增加一个产品的工厂来实现总工厂接口,导致增加了系统的复杂性,有更多的类需要编译和运行,会增加系统性能的开销;
2、由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度;
适用于:
1、产品扩展时,不需要修改原来的代码;
2、总工厂类通过其子类来指定创建哪个对象。利用面向对象的多态性和里氏替换原则,在程序运行时子类覆盖父类对象,从而使得系统更容易扩展。
3、当创建对象时需要大量的代码时