• 工厂方法模式Factory Method


    1.模式定义

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使得一个类的实例化延迟到子类

    2.使用场景

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

    主要优点:

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

    3.具体实现

    3.1 代码示例

    简单工厂:
    1. // 简单工厂
    2. class SimpleFactory {
    3. public static Product createProduct(String type) {
    4. if ("A".equals(type)) {
    5. return new ProductA();
    6. } else if ("B".equals(type)) {
    7. return new ProductB();
    8. } else {
    9. return null;
    10. }
    11. }
    12. }

    工厂方法

    1. // 工厂方法
    2. abstract class ProductFactory {
    3. /**
    4. * 创建产品
    5. *
    6. * @return
    7. */
    8. abstract Product createProduct();
    9. public Product getObject() {
    10. Product product = createProduct();
    11. return product;
    12. }
    13. }
    14. class NonCreateProductA extends ProductFactory {
    15. @Override
    16. Product createProduct() {
    17. return new ProductA();
    18. }
    19. }
    20. class NonCreateProductB extends ProductFactory {
    21. @Override
    22. Product createProduct() {
    23. return new ProductB();
    24. }
    25. }

    示例代码

    1. // 实例代码
    2. interface Product {
    3. String getName();
    4. }
    5. class ProductA implements Product {
    6. @Override
    7. public String getName() {
    8. return "Name's product A";
    9. }
    10. }
    11. class ProductB implements Product {
    12. @Override
    13. public String getName() {
    14. return "Name's product B";
    15. }
    16. }

    测试代码

    1. public class FactoryMethodTest {
    2. public static void main(String[] args) {
    3. // 简单工厂测试代码
    4. Product simpleA = SimpleFactory.createProduct("A");
    5. System.out.println(simpleA.getName());
    6. Product simpleB = SimpleFactory.createProduct("B");
    7. System.out.println(simpleB.getName());
    8. // 工厂方法测试代码
    9. Product pa = new NonCreateProductA().getObject();
    10. System.out.println(pa.getName());
    11. Product pb = new NonCreateProductB().getObject();
    12. System.out.println(pb.getName());
    13. }
    14. }

    3.2 源码中的应用

    1. // java api
    2. // 静态工厂方法
    3. Calendar.getInstance()
    4. java.text.NumberFormat.getInstance()
    5. java.util.ResourceBundle.getBundle()
    6. // 工厂方法
    7. java.net.URLStreamHandlerFactory
    8. javax.xml.bind.JAXBContext.createMarshaller

  • 相关阅读:
    类的加载详解
    el -table 多层级嵌套
    Flink处理函数(一)
    JSP图书销售管理系统
    接收端编程、UDP编程练习、wireshrak抓包工具、UDP包头
    QT实现可拖动自定义控件
    Java应用连接Redis
    MATLAB位运算
    共谋工业3D视觉发展,深眸科技以自研解决方案拓宽场景应用边界
    vue后台项目菜单路由不匹配或者路径错误,添加默认404页面的方法
  • 原文地址:https://blog.csdn.net/xiangbiao2009/article/details/136202444