GOF业务场景的设计模式-----工厂模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。
工厂方法模式 基本代码
- interface IProduct {
- public void productMethod();
- }
- class Product implements IProduct {
- public void productMethod() {
- System.out.println("产品");
- }
- }
- interface IFactory {
- public IProduct createProduct();
- }
- class Factory implements IFactory {
- public IProduct createProduct() {
- return new Product();
- }
- }
- public class Client {
- public static void main(String[] args) {
- IFactory factory = new Factory();
- IProduct prodect = factory.createProduct();
- prodect.productMethod();
- }
- }
业务场景
工厂模式是一个用于实例化对象的模式,是用工厂方法代替new操作的一种方式。工厂模式在Java项目中到处都是,因为工厂模式就相当于创建实例对象的new,如在我们的系统中经常需要记日志,如果创建logger实例时所做的初始化工作可能是很长一段代码,可能要初始化、赋值、查询数据等等,则会导致代码臃肿而难看
- private static Logger logger = LoggerFactory.getLogger(MyBusinessRPC.class);
- logger.error("数据查询失败,table" + ...);
- //源码分析
- public static Logger getLogger(String name) {
- ILoggerFactory iLoggerFactory = getILoggerFactory();
- return iLoggerFactory.getLogger(name);
- }
- //源码分析
- public static ILoggerFactory getILoggerFactory() {
- if (INITIALIZATION_STATE == UNINITIALIZED) {
- INITIALIZATION_STATE = ONGOING_INITIALIZATION;
- performInitialization();
- }
- switch (INITIALIZATION_STATE) {
- case SUCCESSFUL_INITIALIZATION:
- return StaticLoggerBinder.getSingleton().getLoggerFactory();
- case NOP_FALLBACK_INITIALIZATION:
- return NOP_FALLBACK_FACTORY;
- case FAILED_INITIALIZATION:
- throw new IllegalStateException(UNSUCCESSFUL_INIT_MSG);
- case ONGOING_INITIALIZATION:
- // support re-entrant behavior.
- // See also http://bugzilla.slf4j.org/show_bug.cgi?id=106
- return TEMP_FACTORY;
- }
- throw new IllegalStateException("Unreachable code");
- }
业务场景
比如我们要从集合(库存中)中取出一个数据,或者一些调度算法,我们有很策略实现(先进先出,最少使用,最近最少使用,最近最少使用 等)
- public class ArithmeticFactory {
- public Arithmetic createFiFoArithmetic(){
- Arithmetic arithmetic = new FIFOStockArithmetic();
- return arithmetic;
- }
- public Arithmetic createNoUseArithmetic(){
- Arithmetic arithmetic = new NoUseStockArithmetic();
- return arithmetic;
- }
- }
- public interface Arithmetic {
- public void invoke();
- }
- public class FIFOStockArithmetic implements Arithmetic {
- @Override
- public void invoke() {
- System.out.println("使用了先进先出算法!");
//具体算法的业务逻辑- }
- }
- public class NoUseStockArithmetic implements Arithmetic {
- @Override
- public void invoke() {
- System.out.println("使用了最少使用算法!");
//具体算法的业务逻辑- }
- }
测试 结果
- public class FactoryTest {
- public static void main(String args[]){
- ArithmeticFactory arithmeticFactory = new ArithmeticFactory();
- Arithmetic fiFoArithmetic = arithmeticFactory.createFiFoArithmetic();
- Arithmetic noUserarithmetic = arithmeticFactory.createNoUseArithmetic();
- fiFoArithmetic.invoke();
- noUserarithmetic.invoke();
- }
- }
业务场景
spring 和 mybatis 的sqlSessonFactory
- <!-- 配置集成Mybatis -->
- <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="configLocation" value="classpath:/config/SQLMapConfig.xml" />
- <property name="mapperLocations" value="classpath*:com/*/*/**/infra/mybatis/*Mapper.xml"/>
- </bean>
- <bean id="simpleTempalte" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg index="0" ref="sqlSessionFactory" />
- <constructor-arg index="1" value="SIMPLE"/>
- </bean>
- <bean id="batchTempalte" class="org.mybatis.spring.SqlSessionTemplate">
- <constructor-arg index="0" ref="sqlSessionFactory" />
- <constructor-arg index="1" value="BATCH"/>
- </bean>
GOF业务场景的设计模式-----工厂模式的更多相关文章
- GOF业务场景的设计模式-----策略模式
定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 策略模式代码实现 interface IStrategy { public void doSomething(); } class ...
- GOF业务场景的设计模式-----单例模式
个人觉得 纯粹的学习设计模式,是不对的.也不能为了使用设计模式,而硬搬设计模式来使用 单例模式可能是 最简单的设计模式也是 大家知道最多的设计模式.当然 ,有很多种写法 定义:确保一个类只有一个实例, ...
- GOF业务场景的设计模式-----观察者模式
定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新. 在软件系统中经常会有这样的需求:如果一个对象的状态发生改变,某些与它相关的对象也要随之做出 ...
- GOF业务场景的设计模式-----责任链模式
定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止. 首先来看一段代码: public void tes ...
- GOF业务场景的设计模式-----设计模式六大原则
单一职责原则(Single Responsibility Principle) 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1, ...
- .NET设计模式: 工厂模式
.NET设计模式: 工厂模式(转) 转自:http://www.cnblogs.com/bit-sand/archive/2008/01/25/1053207.html .NET设计模式(1): ...
- 【设计模式】Java设计模式 -工厂模式
[设计模式]Java设计模式 -工厂模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目 ...
- 转载 用Python实现设计模式——工厂模式
转载自 SegmentFault作者 夏秋, https://segmentfault.com/a/1190000013053013 非常感谢这位作者的深入浅出的讲解. 前言 工厂模式,顾名思义就是我 ...
- [Design Pattern With Go]设计模式-工厂模式
这次介绍的设计模式是工厂模式,这是一个比较常见的创建型模式.一般情况下,工厂模式分为三种:简单工厂.工厂方法和抽象工厂,下面慢慢举例介绍下. 简单工厂 考虑一个加密程序的应用场景,一个加密程序可能提供 ...
随机推荐
- LINQ语法记录
static void Main(string[] args) { List<Person> persons = new List<Person>(); persons.Add ...
- Linux su和sudo命令的区别,并获得root权限
su(superuser) su表示切换用户,如: 输入:su命令后回车表示切换当前的用户到root用户,或者: 输入:su - root(或者其他用户名)这里加了"-"后表示也切 ...
- 使用Github Pages创建自己的网站
这是一篇使用Github Pages创建自己网站的教程,操作很简单,相信,亲们肯定一学就会,但是大家也要有一定的github基础呀,所以小编给大家附上一个链接(http://www.cnblogs.c ...
- Android成长日记-数据存储之SQLite[1]
[SQLite简介] SQLite是R.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行 ---支持高达2TB大小的数据库: ...
- CodeForces 125E MST Company
E. MST Company time limit per test 8 seconds memory limit per test 256 megabytes input standard inpu ...
- 开发新产品的三个验证阶段(EVT/DVT/PVT)
1.EVT, Engineering Validation Test 是针对工程原型机的验证,对象很可能是一大块开发板,或是很多块开发板:关键是要有足够时间和样品. 通常,如果是新平台,需要花的时间和 ...
- Mac xcode 编译产生app的路径
.../<current User>/Library/Developer/XCode/DerivedData/<Project name>-<other characte ...
- Linux 吃掉我的内存
在Windows下资源管理器查看内存使用的情况,如果使用率达到80%以上,再运行大程序就能感觉到系统不流畅了,因为在内存紧缺的情况下使用交换分区,频繁地从磁盘上换入换出页会极大地影响系统的性能.而当我 ...
- zoj 3946 Highway Project(最短路 + 优先队列)
Highway Project Time Limit: 2 Seconds Memory Limit: 65536 KB Edward, the emperor of the Marjar ...
- JavaWeb---总结(十)HttpServletRequest对象(一)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...