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有更深入的理解,并且对单例模式有了更深一层的认识!
相关推荐
1. **简单工厂模式(Simple Factory Pattern)**: - 简单工厂模式是一种静态工厂方法模式,它包含一个静态工厂类,负责创建对象。在这个例子中,可能有一个名为`Factory`的类,其中包含一个静态方法,如`...
简单工厂模式(Simple Factory Pattern)是一种静态工厂方法,它通过一个公共的工厂类来创建对象。这个工厂类通常包含一个或多个静态方法,用于根据输入参数创建不同类型的实例。这种模式的优点在于客户端代码无需...
java设计模式 简单工厂模式详解 simple factory static pattern
简单工厂模式(Simple Factory Pattern)又称静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据自变量的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建...
六个创建型模式 六个创建型模式 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(一) 工厂三兄弟之简单工厂模式(二) 工厂三兄弟之简单工厂模式(三) 工厂三兄弟之简单工厂模式(四) 工厂方法...
首先,简单工厂模式(Simple Factory Pattern)是最基础的一种,它提供一个静态方法来创建对象,根据传入的参数类型决定创建哪种产品。这种模式的主要优点是客户端代码无需直接实例化具体的产品类,而是通过工厂来...
1. **简单工厂模式(Simple Factory Pattern)**:由一个静态方法来创建产品对象,它是最简单的工厂模式形式,但不利于扩展,因为静态方法不能被继承。 2. **工厂方法模式(Factory Method Pattern)**:定义一个...
首先,我们来看一下“简单工厂模式”(Simple Factory Pattern)。这种模式的核心思想是提供一个工厂类,负责根据输入条件创建具体的产品对象。在这个例子中,"pre1"可能是原始的、未使用设计模式的代码,可能直接...
1. 简单工厂模式(Simple Factory Pattern):也称为静态工厂方法模式,通过一个静态方法来创建对象,该静态方法根据传入的参数返回不同的实例。 2. 工厂方法模式(Factory Method Pattern):属于多态性设计模式,...
在我们的“simplefactory.zip”文件中,我们可以看到一个简单的工厂模式实现示例。这个例子可能包括以下几个部分: - 一个接口,例如`Product`,定义了产品类的基本行为。 - 若干个实现`Product`接口的具体产品类,...
1. **简单工厂模式(Simple Factory Pattern)**: - 在这种模式中,有一个静态工厂方法,根据传入的参数类型,返回不同类型的实例。简单工厂模式通常用于那些实例化对象的逻辑相对简单的场景。 - 优点:客户端...
简单工厂模式(Simple Factory Pattern)是一种设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在简单工厂模式中,当一个类不知道它所必须创建的对象的类的时候,它会将这个任务委托给一个工厂对象。在...
1. **简单工厂模式(Simple Factory Pattern)**:在单个工厂类中直接创建产品实例,工厂类通常包含一个条件语句来决定创建哪种具体产品。 2. **工厂方法模式(Factory Method Pattern)**:将具体产品的创建延迟到...
在例子中,`Factory`是抽象工厂,`SimpleFactory`和`BombFactory`是具体工厂,它们分别创建`Sample`和`Sample2`的不同子类实例。 建造者模式(Builder Pattern)则将复杂对象的构建与其表示分离,使得同样的构建...
简单工厂模式(Simple Factory Pattern)是一种静态工厂方法模式,它包含一个工厂类,负责根据输入参数创建相关的产品对象。工厂类知道如何创建对象,而客户端只需知道如何使用对象,无需关心对象是如何被创建的。 ...
获取到【文件夹】名称: simple_factory_pattern 获取到【文件夹】名称: single_pattern 获取到【文件夹】名称: status_pattern 获取到【文件夹】名称: strategy_pattern 获取到【文件夹】名称: templet_...
单态模式(Singleton Pattern)和简单工厂模式(Simple Factory Pattern)是软件设计中常见的两种创建型设计模式。在Java编程中,它们都是为了简化对象的创建过程,但各自有着不同的应用场景和特点。 单态模式是一...
1. **简单工厂模式**(Simple Factory Pattern):这是最基础的工厂模式,也称为静态工厂方法模式。它由一个静态工厂类负责创建一系列相关的对象,这些对象通常具有共同的接口。 2. **工厂方法模式**(Factory ...
简单工厂设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。...在学习和实践中,阅读和分析`Design Pattern`中的代码示例,能够帮助我们深入理解简单工厂模式的工作原理及其应用场景。