定义:定义一个用于创建对象的接口,让字类决定实现哪一个类型,factory method 使得一个类的实例化延迟到字类
1.工厂方法模式遵守软件设计原则(close-open)开闭原则:对拓展开放,对修改关闭
2.单一职责原则:各个对象固定自己的原则
应用场景:
1.当你不知道该使用对象的确切类型的时候
2.当你希望为库或者框架提供可拓展的内部组件的方法时
主要优点:
1.将具体的产品业务和创建解耦
2.符合单一职责原则
3.符合开闭原则
源码中的应用:
Calendar.getInstance();
java.text.NumberFormat.getInstance();
java.util.ResourceBundle.getBundle("");
//工厂方法
java.net.URLStreamHandlerFactory;
javax.xml.bind.JAXBContext.createMarshaller
Demo示例:
package com.xiaobai.sheJiMoShi.factory;
/**
* 工厂方法模式
*
* @Author xiaoBai
* @Date 2021-04-23
*/
public class FactoryMethod {
public static void main(String[] args) {
Application application = new ConcreateProductA();
Product product = application.getObject();
product.method1();
}
}
class simpleFactory{
public static Product createFactory(String type){
if ("0".equals(type)){
return new ProductA();
}else if ("1".equals(type)){
return new ProductA1();
}else {
return null;
}
}
}
interface Product{
void method1();
}
class ProductA implements Product{
@Override
public void method1() {
System.out.println("ProductA.method1 executed...");
}
}
class ProductA1 implements Product{
@Override
public void method1() {
System.out.println("ProductA1.method1 executed...");
}
}
abstract class Application {
/**
* 抽象类交由字类去实现
*
* @return
*/
abstract Product createProduct();
Product getObject() {
Product product = createProduct();
//.... 业务处理
return product;
}
}
class ConcreateProductA extends Application{
@Override
Product createProduct() {
//.... 业务处理
return new ProductA();
}
}