简单概述,后续会详细讲解的
- 静态工厂方法:工厂初始化之前,工厂中的类已经被实例化放在工厂容器中
- 实例工厂方法:工厂在构造方法初始化时,会将类进行实例化放在工厂中
简单概述,后续会详细讲解的
转载于:https://www.cnblogs.com/l-x-x-y-d-j/p/11355076.html
这三种方式分别为:使用静态工厂创建对象,使用实例工厂创建对象,使用无参构造函数创建对象。
工厂模式:工厂提供服务(方法),客户只需要满足服务的条件即可,解耦很明显,这里自己的责任自己负责,每一环没有必要关心另一环的逻辑实现。
静态工厂和实例工厂区别:静态工厂指的是工厂的服务是静态的,也就是工厂提供的方法是static的,那么这些方法仅有工厂提供以及管理更新等,跟客户端或者说调用端是没有关系的;实例工厂指的是工厂提供的方法服务室非static的,那么客户端或者调用端是需要自己创建工厂对象然后去调用工厂中的方法或者服务的,那么管理这些方法或者服务相当于是客户端了。所以静态工厂和实例工厂主要是实际参与管理工厂管理者的不同,其次实例工厂设计相对灵活,客户端与工厂都可以参与管理设计,静态工厂相对正式死板。
以下三种创建对象的方法前两种是工厂模式创建,第三种是单例创建,工厂创建只需要注意是静态工厂还是实例工厂,对象都是在工厂中创建出来的,因此,工厂创建模式配置相对比较少。单例创建对象的话需要多少对象就创建多少对象,相对配置较多。比如第一种静态创建对象,
下面见代码:
静态工厂创建对象:
一:通过静态工厂模式创建对象
package cn.itcast.beans;
public class Bean1 {
public void add(){
System.out.println("bean1 ........");
}
}
package cn.itcast.beans;
public class Bean1_factory {
public static Bean1 getBean(){
return new Bean1();
}
}
二:通过实例工厂模式创建对象
package cn.itcast.beans;
public class Bean2 {
public void add(){
System.out.println("bean2 ........");
}
}
package cn.itcast.beans;
public class Bean2_factory {
public Bean2 getBean(){
return new Bean2();
}
}
三:通过简单构造函数创建单例对象
package cn.itcast.beans;
public class Bean3 {
public void add(){
System.out.println("bean3 ........");
}
}
package cn.itcast.beans;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args){
ApplicationContext context =
new ClassPathXmlApplicationContext("beans01.xml");
Bean1 b1 = (Bean1)context.getBean("bean1");
Bean2 b2 = (Bean2)context.getBean("bean2");
Bean3 b3 = (Bean3)context.getBean("bean3");
b1.add();
b2.add();
b3.add();
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 使用静态工厂创建对象 -->
<bean id="bean1" class="cn.itcast.beans.Bean1_factory"
factory-method="getBean">
</bean>
<!-- 使用实例工厂创建对象 -->
<bean id="bean2_fcty" class="cn.itcast.beans.Bean2_factory">
</bean>
<bean id="bean2" factory-bean="bean2_fcty" factory-method="getBean">
</bean>
<!-- 使用无参构造函数创建对象 -->
<bean id="bean3" class="cn.itcast.beans.Bean3">
</bean>
</beans>
新闻实体类NewsBean
package com.tang;
/**
* 新闻实体类
*/
public class News {
String title;
String content;
@Override
public String toString() {
return "News{" +
"title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public News(String title, String content) {
this.title = title;
this.content = content;
}
public News() {
}
}
实例工厂方法
package com.tang;
import java.util.HashMap;
import java.util.Map;
/**
* 实例工厂
*/
public class InstanceFactory {
Map<String,News> newsMap = new HashMap<String,News>();
public InstanceFactory(){
newsMap.put("news1",new News("InstanceFactory标题1","内容1"));
newsMap.put("news2",new News("InstanceFactory标题2","内容2"));
}
public News getNews(String name){
return newsMap.get(name);
}
}
静态工厂方法
package com.tang;
import java.util.HashMap;
import java.util.Map;
/**
* 静态工厂
*/
public class StaticFactory {
private static Map<String,News> newsMap = new HashMap<String,News>();
static {
newsMap.put("news1",new News("StaticFactory标题1","内容1"));
newsMap.put("news2",new News("StaticFactory标题2","内容2"));
}
public static News getNews(String name){
return newsMap.get(name);
}
}
xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--静态工厂方法 工厂不需要实例化-->
<bean id="news11" class="com.tang.StaticFactory" factory-method="getNews">
<constructor-arg value="news1"/>
</bean>
<bean id="news12" class="com.tang.StaticFactory" factory-method="getNews">
<constructor-arg value="news2"/>
</bean>
<!--实例工厂方法是先将工厂实例化-->
<bean id="instanceFactory" class="com.tang.InstanceFactory"/>
<bean id="news21" factory-bean="instanceFactory" factory-method="getNews">
<constructor-arg value="news1"/>
</bean>
<bean id="news22" factory-bean="instanceFactory" factory-method="getNews">
<constructor-arg value="news2"/>
</bean>
</beans>
main测试方法(使用单元测试的方法进行测试)
package com.tang;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
private ClassPathXmlApplicationContext ctx;
@Before
public void before() {
//初始化Spring容器,当Spring容器初始化时,会自动加载配置文件,然后根据配置文件中的内容初始化Bean
ctx = new ClassPathXmlApplicationContext("application.xml");
}
@Test
public void test1() {
News news11 = (News) ctx.getBean("news11");
System.out.println(news11);
News news12 = (News) ctx.getBean("news12");
System.out.println(news12);
}
@Test
public void test2() {
News news21 = (News) ctx.getBean("news21");
System.out.println(news21);
News news22 = (News) ctx.getBean("news22");
System.out.println(news22);
}
}
测试结果
test1:
News{title='StaticFactory标题1', content='内容1'}
News{title='StaticFactory标题2', content='内容2'}
Process finished with exit code 0
test2:
News{title='InstanceFactory标题1', content='内容1'}
News{title='InstanceFactory标题2', content='内容2'}
Process finished with exit code 0
参考https://blog.csdn.net/woshiwusonghaha/article/details/72801187
什么是静态工厂?
工厂类所有方法都是静态的
/**
* 里面一般来说都是静态的方法
* @author memory_coder
* @2017年10月2日 上午10:05:31
*/
public class StaticBeanFactory {
public static User getUser()
{
return new UserImpl();
}
}
在Application.xml文件中的配置
<!-- class为静态工厂类的全限定类名 factory-method为使用的静态方法
<bean id="user" class="com.slxy.factory.StaticFactory" factory-method="getUser" ></bean>
工厂类的方法为静态方法
/**
* @author memory_coder
* @2017年10月3日 下午6:49:44
*/
public class InstantBeanFactory {
public User getUser()
{
return new UserImpl();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 配置实例工厂 -->
<bean id="userFactory" class="com.slxy.factory.InstantBeanFactory" ></bean>
<!-- 配置工厂实例的对象 factory-bean为使用实例工厂的id属性值 factory-method为调用工厂的方法-->
<bean id="userId" factory-bean="userFactory" factory-method="createUserService"></bean>
</beans>
使用方法都一样
/**
* @author memory_coder
* @2017年10月3日 下午6:57:28
*/
public class InstantBeanFactoryText {
@Test
public void createUserService()
{
// 加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("InstantApplication.xml");
// 获得user实例对象
UserS us = context.getBean("userId",User.class);
us.addUser();
}
}