FactoryMethod工厂方法模式详解

目录

模式定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。

Factory Method 使得一个类的实例化延迟到子类。

实现方式

简单工厂

以下示例非设计模式,仅为编码的一种规范

java 复制代码
public class FactoryMethod {
    public static void main(String[] args) {
        Application application = new Application();
        Product product = application.getObject("0");
        product.method1();
    }
}

interface Product{
    void method1();
}

class ProductA implements Product{
    public void method1(){
        System.out.println("ProductA.method1 executed.");
    }
}

class ProductB implements Product{
    public void method1(){
        System.out.println("ProductB.method1 executed.");
    }
}

class SimpleFactory{
    public static Product createProduct(String type){
        if ("0".equals(type)){
            return new ProductA();
        }else if ("1".equals(type)){
            return new ProductB();
        }else {
            return null;
        }
    }
}

class Application {
    private Product createProduct(String type){
        return SimpleFactory.createProduct(type);
    }

    Product getObject(String type){
        Product product = createProduct(type);
        return product;
    }
}

工厂方法

java 复制代码
public class FactoryMethod {
    public static void main(String[] args) {
        Application application = new ConcreteProductA();
        Product product = application.getObject();
        product.method1();
    }
}

interface Product{
    void method1();
}

class ProductA implements Product{
    public void method1(){
        System.out.println("ProductA.method1 executed.");
    }
}

class ProductB implements Product{
    public void method1(){
        System.out.println("ProductB.method1 executed.");
    }
}

class SimpleFactory{
    public static Product createProduct(String type){
        if ("0".equals(type)){
            return new ProductA();
        }else if ("1".equals(type)){
            return new ProductB();
        }else {
            return null;
        }
    }
}

//class Application {
//    private Product createProduct(String type){
//        return SimpleFactory.createProduct(type);
//    }
//
//    Product getObject(String type){
//        Product product = createProduct(type);
//        return product;
//    }
//}

abstract class Application {
    abstract Product createProduct();
    Product getObject(){
        Product product = createProduct();
        return product;
    }
}

// 工厂方法具体实现类
class ConcreteProductA extends Application{

    @Override
    Product createProduct() {
        // 。。。业务逻辑缺省
        return new ProductA();
    }
}

class ConcreteProductB extends Application{

    @Override
    Product createProduct() {
        // 。。。业务逻辑缺省
        return new ProductB();
    }
}

主要优点

  1. 将具体产品和创建者解耦
  2. 符合单一职责原则
  3. 符合开放封闭原则

应用场景

  1. 抽象:当你不知道该使用对象的确切类型的时候。
  2. 扩展:当你希望为库或框架提供扩展其内部组件的方法时。

源码中的应用

// java api

// 静态工厂方法

java 复制代码
Calendar.getInstance()
java 复制代码
java.text.NumberFormat.getInstance()
java 复制代码
java.util.ResourceBundle.getBundle()

// 工厂方法

java 复制代码
java.net.URLStreamHandlerFactory
java 复制代码
javax.xml.bind.JAXBContext.createMarshaller

创作不易,点赞、关注、收藏
创作不易,点赞、关注、收藏
创作不易,点赞、关注、收藏

相关推荐
正儿八经的少年6 小时前
application.yml 系列配置文件作用与区别
java·配置文件
鱼很腾apoc6 小时前
【学习篇】第20期 超详解 C++ 多态:从语法规则到底层原理
java·c语言·开发语言·c++·学习·算法·青少年编程
cheems95277 小时前
[Spring MVC] 统一功能与拦截器实践总结
java·spring·mvc
Full Stack Developme7 小时前
Spring Boot 事务管理完整教程
java·数据库·spring boot
城管不管8 小时前
前后端远程协作
java
青云计划8 小时前
Feed流
java·后端·spring
java1234_小锋8 小时前
String、StringBuilder、StringBuffer的区别?
java·开发语言
星原望野8 小时前
JAVA集合:List、Set和Map
java·开发语言·list·set·map·集合
2601_957787588 小时前
星链引擎矩阵系统:插件化多平台 API 网关与账号级隔离技术实践
java·矩阵·插件化架构
nnsix9 小时前
设计模式 - 模板方法模式 笔记
笔记·设计模式·模板方法模式