设计模式之工厂方法模式
创始人
2024-03-27 00:43:07
0

factory method design pattern

工厂方法模式的概念、工厂方法模式的结构、工厂方法模式的优缺点、工厂方法模式的使用场景、工厂方法模式的实现示例、工厂方法模式的源码分析


1、工厂方法的概念

  工厂方法模式,及简单工厂模式的升级版,其抽象了对象的创建,将对象的具体创建延迟到了其子类中。这样,当有新产品加入时,不用再修改已有的工厂类,只需要增加新产品的实现和新产品对应工厂的实现即刻。

2、工厂方法的结构

  • 抽象产品:定义产品的行为。
  • 具体产品:实现抽象产品,使产品具像化。
  • 抽象工厂:定义生产产品的行为。
  • 具体工厂:实现抽象工厂,来创建一个具体产品的对象实例。其与具体产品是一对一的关系。

factory-method-class

3、工厂方法的优缺点

  • 优点:
    • 用户只需要知道具体的产品工厂即刻得到产品,无需了解产品的创建过程。
    • 新增产品时只需要新增具体产品类和其对应的具体工厂类即刻,无需对已有的工厂类进行修改,符合开闭原则的要求。
  • 缺点:
    • 当系统中产品过多时,会使系统过于复杂。

4、工厂方法的使用场景

  • 需要创建对象的地方。
  • 需要灵活的、可扩展的框架。
  • 针对同种类不同属性的操作,如数据库中的 mysql、oracle 等。

5、工厂方法的实现示例

抽象产品:

public interface Product {/*** 定义产品行为*/void behavior();
}

具体产品一:

public class OneProduct implements Product {@Overridepublic void behavior() {System.out.println("我是产品一");}
}

具体产品二:

public class TwoProduct implements Product {@Overridepublic void behavior() {System.out.println("我是产品二");}
}

抽象工厂:

public interface Factory {/*** 生产* @return*/Product product();
}

具体工厂一:

public class OneFactory implements Factory {@Overridepublic Product product() {return new OneProduct();}
}

具体工厂二:

public class TwoFactory implements Factory {@Overridepublic Product product() {return new TwoProduct();}
}

测试:

public class FactoryMethodTest {public static void main(String[] args) {Factory oneFactory = new OneFactory();Factory twoFactory = new TwoFactory();Product oneProduct = oneFactory.product();Product twoProduct = twoFactory.product();oneProduct.behavior();twoProduct.behavior();}
}

测试结果:

我是产品一
我是产品二

6、工厂方法的源码分析

  slf4j 中的 Logger logger = LoggerFactory.getLogger(FactoryMethodTest.class) 就是工厂方法模式的实现体现。其中 Logger 接口就是抽象产品接口,具体产品类如 EventRecodingLogger、SubstituteLogger 等;ILoggerFactory 抽象类就是抽象工厂,SubstituteLoggerFactory 等就是具体工厂类。
  另外 spring 中的 FactoryBean、java.util.concurrent 中的 ThreadFactory、mybatis 中的 SqlSessionFactory 等就是工厂方法模式。

public interface Logger {...
}
public interface ILoggerFactory {/*** Return an appropriate {@link Logger} instance as specified by the* name parameter.* * 

If the name parameter is equal to {@link Logger#ROOT_LOGGER_NAME}, that is * the string value "ROOT" (case insensitive), then the root logger of the * underlying logging system is returned.* *

Null-valued name arguments are considered invalid.**

Certain extremely simple logging systems, e.g. NOP, may always* return the same logger instance regardless of the requested name.* * @param name the name of the Logger to return* @return a Logger instance */public Logger getLogger(String name); }

public class SubstituteLoggerFactory implements ILoggerFactory {...public synchronized Logger getLogger(String name) {SubstituteLogger logger = (SubstituteLogger)this.loggers.get(name);if (logger == null) {logger = new SubstituteLogger(name, this.eventQueue, this.postInitialization);this.loggers.put(name, logger);}return logger;}...
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...