Simple Factory Pattern
简单工厂模式(Simple Factory Pattern)
工厂是什么呢?工厂是生产产品的,BeanFactory是生产Bean对象的,水果工厂是生产水果的,工厂模式的作用就是,我们不需要去new一个对象了,直接通过工厂模式,让工厂给我们提供需要的对象即可。
下面以水果工厂为例,简单说一下
package com.pattern.simplefactory; /** * 水果工厂,用来造水果的,给我名字,我给你对象 */ public class FruitFactory { public static Fruit getFruit(String name){ if(name!=null&&name.equalsIgnoreCase("apple")){ return new Apple();//匹配字符串,创建水果对象 } return null; } }
package com.pattern.simplefactory; /** * 水果接口,所有的水果都有一个方法,sayName */ public interface Fruit { public void sayName(); }
package com.pattern.simplefactory; /** * 苹果,实现了水果接口,有sayName方法 */ public class Apple implements Fruit{ @Override public void sayName() { System.out.println("Apple"); } }
package com.pattern.simplefactory; public class Test { public static void main(String[] args) { Apple apple=(Apple) FruitFactory.getFruit("apple"); apple.sayName(); } }
Spring里面的bean管理原理
Spring有一个工厂模式BeanFactory,提供一个getBean(name)方法
配置Spring的配置文件
applicationContext.xml
<bean name class/>
name对应的是获取class中完全限定名指定的类
用户通过getBean方法,传入name,获取指定的对象
bean管理的简单实现
这里采用的是properties配置文件
prop.properties
apple=com.pattern.beanfactory.Apple
package com.pattern.beanfactory; import java.io.IOException; import java.util.Properties; public class BeanFactory { //一次性读取src目录下的配置文件prop.properties存到prop中,Spring使用的是xml基本一样 private static Properties prop; static{ prop=new Properties(); try { prop.load(BeanFactory.class.getClassLoader().getResourceAsStream("prop.properties")); } catch (IOException e) { e.printStackTrace(); } } //通过反射机制,返回指定name对应的class的实例 public static Object getBean(String name){ if(prop.containsKey(name)){ String className=prop.getProperty(name); try { return Class.forName(className).newInstance(); } catch (Exception e) { e.printStackTrace(); } } return null; } }
package com.pattern.beanfactory; /** * 水果接口,所有的水果都有一个方法,sayName */ public interface Fruit { public void sayName(); }
package com.pattern.beanfactory; /** * 苹果,实现了水果接口,有sayName方法 */ public class Apple implements Fruit{ @Override public void sayName() { System.out.println("Apple"); } }
package com.pattern.beanfactory; public class Test { public static void main(String[] args) { Apple apple=(Apple) BeanFactory.getBean("apple"); apple.sayName(); } }
提醒:这是Spring的基本实现,但Spring的实例创建都是单例模式!
如何让我们的的BeanFactory提供的实例是单例模式呢?
prop1.properties
apple=com.pattern.beanfactory1.Apple
package com.pattern.beanfactory1; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Properties; public class BeanFactory { private static Properties prop; //map集合中用来装实例,保证一个name只对应一份实例 private static Map<String, Object> map=new HashMap<String, Object>(); static{ prop=new Properties(); try { prop.load(BeanFactory.class.getClassLoader().getResourceAsStream("prop1.properties")); } catch (IOException e) { e.printStackTrace(); } } //通过反射机制,返回指定name对应的class的实例 public static Object getBean(String name){ if(prop.containsKey(name)){ //如果map中存在实例,直接返回,如果不存在,执行创建过程,并将新的实例添加到map中,下次getBean就不用newInstance了 if(map.containsKey(name)){ return map.get(name); } else{ String className=prop.getProperty(name); try { Object o=Class.forName(className).newInstance(); map.put(name, o); return o; } catch (Exception e) { e.printStackTrace(); } } } return null; } }
package com.pattern.beanfactory1; /** * 水果接口,所有的水果都有一个方法,sayName */ public interface Fruit { public void sayName(); }
package com.pattern.beanfactory1; /** * 苹果,实现了水果接口,有sayName方法 */ public class Apple implements Fruit{ @Override public void sayName() { System.out.println("Apple"); } }
package com.pattern.beanfactory1; public class Test { public static void main(String[] args) { Apple apple=(Apple) BeanFactory.getBean("apple"); Apple apple2=(Apple) BeanFactory.getBean("apple"); System.out.println(apple==apple2);//true } }
提醒:事实上,Spring在容器启动的时候就完成了配置的类的实例化,而不是用户需要的时候才去实例并单例的。
我们如何实现在容器启动的时候完成实例并单例呢?
其实很简单,把实例操作放到static静态块中即可!
只有BeanFactory中部分变化:
package com.pattern.beanfactory1; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; public class BeanFactory { private static Properties prop; //map集合中用来装实例,保证一个name只对应一份实例 private static Map<String, Object> map=new HashMap<String, Object>(); static{ prop=new Properties(); try { prop.load(BeanFactory.class.getClassLoader().getResourceAsStream("prop1.properties")); //***************************************************** //Spring的真正的单例形式,大致是这样的,在容器启动的时候就实例所有的配置类 for(Entry<Object, Object> entry:prop.entrySet()){ String key=entry.getKey().toString(); String className=entry.getValue().toString(); try { map.put(key, Class.forName(className).newInstance()); } catch (Exception e) { e.printStackTrace(); } } //***************************** } catch (IOException e) { e.printStackTrace(); } } public static Object getBean(String name){ //获取实例,直接到map中去找即可 if(map.containsKey(name)){ return map.get(name); } return null; } }
简单工厂模式是面试常考的题目,学完简单工厂模式,最大的收获应该是对Spring的BeanFactory有更深入的理解,并且对单例模式有了更深一层的认识!
相关推荐
java设计模式 简单工厂模式详解 simple factory static pattern
六个创建型模式 六个创建型模式 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(一) 工厂三兄弟之简单工厂模式(二) 工厂三兄弟之简单工厂模式(三) 工厂三兄弟之简单工厂模式(四) 工厂方法...
获取到【文件夹】名称: simple_factory_pattern 获取到【文件夹】名称: single_pattern 获取到【文件夹】名称: status_pattern 获取到【文件夹】名称: strategy_pattern 获取到【文件夹】名称: templet_...
对比了 工厂类 factory pattern 和 simple factory pattern
java 设计模式 bridge CommandPattern factoryMethod simpleFactory
:check_mark:简单工厂模式( Simple Factor Pattern ) :memo: , :check_mark:工厂方法模式( Factory Method Pattern ) :memo: , :check_mark:抽象工厂模式( Abstract Factroy Pattern ) :memo: , :check_...
java简易版开心农场源码 DesignPattern 从0开始深入理解设计模式的原理及应用 1.设计原则 1.8.设计原则总结 学习设计原则是学习设计模式的基础。在实际开发过程中, 并不要求所有代码都遵循设计原则,我们要考虑...
第03章 术业有专攻:简单工厂模式 (SimpleFactory) 第04章 精益求精:工厂方法模式 (FactoryMethod) 第05章 再接再厉:抽象工厂模式 (AbstractFactory) 第06章 孜孜不倦:创建者模式 (Builder) 第07章 照猫画虎:...
23种设计模式演示代码文件结构图gof23 |- creational(创建型模式) |- simplefactory 简单工厂模式案例 |- factorymethod 工厂方法模式案例 |- abstractfactory 抽象工厂模式案例 |- builder 建造者模式案例 |- ...
1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 这三种模式从上到下逐步抽象,并且更具一般性。 GOF在《设计模式》一书中将工厂模式分为两类...
简单工厂模式 在工厂类中用switch分支生成对象 优点:工厂类中包含了判断逻辑,根据客户端选择动态实例化相关的类,去除了与具体产品的依赖。 strategy 策略模式 它定义了算法家族,分别封装起来,让它们之间可以...
使用工厂模式就象使用 new 一样频繁. 设计模式之 Builder 汽车由车轮 方向盘 发动机很多部件组成,同时,将这些部件组装成汽车也是一件复杂的工作,Builder 模式就是将这两 种情况分开进行。 设计模式之 ...
JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...
不该用Generics实现Abstract Factory的理由 C#2.0-泛型 C#2.0-extern C#2.0-可空类型 C#2.0-分部类 C#2.0-迭代器 C#2.0 的新增功能学习 泛型的序列化问题 .NET 2.0 泛型在实际开发中的一次小应用 C#2.0 Singleton 的...
====================== 简单的工厂模式 添加简单工厂设计模式的代码 添加了 Pizza 类和两个子类 Cheese 和 Peperoni,实现了 Pizza 类 PizzaStore 使用 Pizza 类及其子类 将对象创建代码从 PizzaStore 移动到 ...
超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...
Use the PageFactory pattern to build a robust and easy to maintain test framework Build data-driven tests and extend Selenium API to implement custom steps and checks Integrate and use ATDD/BDD ...
Java SE5 and SE6 .................. 2 Java SE6 ......................................... 2 The 4th edition........................ 2 Changes .......................................... 3 Note on the ...
You also want to learn how patterns are used in the Java API, and how to exploit Java’s built-in pattern support in your own code. You want to learn the real OO design principles and why everything...