`

简单工厂模式(Simple Factory Pattern)_Java

阅读更多

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三种工厂模式文档+三个实例.rar

    1. **简单工厂模式(Simple Factory Pattern)**: - 简单工厂模式是一种静态工厂方法模式,它包含一个静态工厂类,负责创建对象。在这个例子中,可能有一个名为`Factory`的类,其中包含一个静态方法,如`...

    简单工厂模式,工厂方法模式,抽象工厂模式

    简单工厂模式(Simple Factory Pattern)是一种静态工厂方法,它通过一个公共的工厂类来创建对象。这个工厂类通常包含一个或多个静态方法,用于根据输入参数创建不同类型的实例。这种模式的优点在于客户端代码无需...

    简单工厂模式

    java设计模式 简单工厂模式详解 simple factory static pattern

    JAVA设计模式之工厂模式.pdf

    简单工厂模式(Simple Factory Pattern)又称静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据自变量的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建...

    design-pattern-java.pdf

    六个创建型模式 六个创建型模式 简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(一) 工厂三兄弟之简单工厂模式(二) 工厂三兄弟之简单工厂模式(三) 工厂三兄弟之简单工厂模式(四) 工厂方法...

    java设计模式之三大工厂模式

    首先,简单工厂模式(Simple Factory Pattern)是最基础的一种,它提供一个静态方法来创建对象,根据传入的参数类型决定创建哪种产品。这种模式的主要优点是客户端代码无需直接实例化具体的产品类,而是通过工厂来...

    工厂模式(Factory)

    1. **简单工厂模式(Simple Factory Pattern)**:由一个静态方法来创建产品对象,它是最简单的工厂模式形式,但不利于扩展,因为静态方法不能被继承。 2. **工厂方法模式(Factory Method Pattern)**:定义一个...

    简单工厂模式和工厂模式Demo

    首先,我们来看一下“简单工厂模式”(Simple Factory Pattern)。这种模式的核心思想是提供一个工厂类,负责根据输入条件创建具体的产品对象。在这个例子中,"pre1"可能是原始的、未使用设计模式的代码,可能直接...

    工厂模式代码

    1. 简单工厂模式(Simple Factory Pattern):也称为静态工厂方法模式,通过一个静态方法来创建对象,该静态方法根据传入的参数返回不同的实例。 2. 工厂方法模式(Factory Method Pattern):属于多态性设计模式,...

    simplefactory.zip

    在我们的“simplefactory.zip”文件中,我们可以看到一个简单的工厂模式实现示例。这个例子可能包括以下几个部分: - 一个接口,例如`Product`,定义了产品类的基本行为。 - 若干个实现`Product`接口的具体产品类,...

    java工厂模式

    1. **简单工厂模式(Simple Factory Pattern)**: - 在这种模式中,有一个静态工厂方法,根据传入的参数类型,返回不同类型的实例。简单工厂模式通常用于那些实例化对象的逻辑相对简单的场景。 - 优点:客户端...

    Simple Factory模式.doc

    简单工厂模式(Simple Factory Pattern)是一种设计模式,属于创建型模式,它提供了一种创建对象的最佳方式。在简单工厂模式中,当一个类不知道它所必须创建的对象的类的时候,它会将这个任务委托给一个工厂对象。在...

    JAVA设计模式之工厂模式

    1. **简单工厂模式(Simple Factory Pattern)**:在单个工厂类中直接创建产品实例,工厂类通常包含一个条件语句来决定创建哪种具体产品。 2. **工厂方法模式(Factory Method Pattern)**:将具体产品的创建延迟到...

    java 设计模式 java pattern

    在例子中,`Factory`是抽象工厂,`SimpleFactory`和`BombFactory`是具体工厂,它们分别创建`Sample`和`Sample2`的不同子类实例。 建造者模式(Builder Pattern)则将复杂对象的构建与其表示分离,使得同样的构建...

    设计模式在android中的应用之1,简单工厂模式

    简单工厂模式(Simple Factory Pattern)是一种静态工厂方法模式,它包含一个工厂类,负责根据输入参数创建相关的产品对象。工厂类知道如何创建对象,而客户端只需知道如何使用对象,无需关心对象是如何被创建的。 ...

    JAVA23种设计模式代码学习.zip

    获取到【文件夹】名称: simple_factory_pattern 获取到【文件夹】名称: single_pattern 获取到【文件夹】名称: status_pattern 获取到【文件夹】名称: strategy_pattern 获取到【文件夹】名称: templet_...

    单态模式和简单工厂模式

    单态模式(Singleton Pattern)和简单工厂模式(Simple Factory Pattern)是软件设计中常见的两种创建型设计模式。在Java编程中,它们都是为了简化对象的创建过程,但各自有着不同的应用场景和特点。 单态模式是一...

    java(工厂设计模式)

    1. **简单工厂模式**(Simple Factory Pattern):这是最基础的工厂模式,也称为静态工厂方法模式。它由一个静态工厂类负责创建一系列相关的对象,这些对象通常具有共同的接口。 2. **工厂方法模式**(Factory ...

    设计模式简单工厂

    简单工厂设计模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。...在学习和实践中,阅读和分析`Design Pattern`中的代码示例,能够帮助我们深入理解简单工厂模式的工作原理及其应用场景。

Global site tag (gtag.js) - Google Analytics