spring 与设计模式(创建型)之工厂模式Factory

一、前言

1、为了提高内聚和松耦合,我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们就可以通过基类的子类的实现来达到多态的目的。这里容易出现一个问题n个子类继承自抽象基类,我们不得不在每次用到子类的地方编写new xxx;代码

2、程序的扩展性和维护性变得越来越困难

3、有时候父类并不知道具体要实例化哪一个具体子类。假设我们在类A中要使用类B,类B 是一个抽象父类或者接口,在A中并不知道要实例化那一个B的子类,但是在类A的子类D是知道的。在A中我们没有办法直接使用类似new xxx的语句。

spring /工厂设计模式是怎样解决两个问题的?

二、Factory


在Factory方法中有一个类担任工厂角色负责生产类,如Factory2

package com.bitch.design.action.factory;

/**
 * @author chenhaipeng
 * @version 1.0
 * @date 2015/10/30 17:59
 */
public class Factory2 {
    //
    public static Product getInstance(Class clazz){
        if(clazz.equals(ConcreateProduct1.class)){
            return new ConcreateProduct1();
        }else if(clazz.equals(ConcreateProduct2.class)){
            return new ConcreateProduct2();
        }
        return null;
    }
}

这个类有个特点,往往是需要一些判断来创建的是什么类,但是问题来了,如果子类增加需要修改工厂方法 的判断。

三、abstract Factory

子类的增加不会修改工厂只需要实现其相应的子类即可

package com.bitch.design.action.factory;

/**
 * @author chenhaipeng
 * @version 1.0
 * @date 2015/10/30 16:25
 */
public abstract class Factory {
    public abstract Product getInstance();
    public abstract Product getInstance2(Class clazz);

}

package com.bitch.design.action.factory;

/**
 * @author chenhaipeng
 * @version 1.0
 * @date 2015/10/30 17:01
 */
public class ConcreateFactory extends Factory {

    @Override
    public Product getInstance() {
        return new ConcreateProduct1();
    }

    @Override
    public Product getInstance2(Class clazz) {
        return null;
    }
}


package com.bitch.design.action.factory;

/**
 * @author chenhaipeng
 * @version 1.0
 * @date 2015/10/30 17:04
 */
public class FactoryMainTest {
    //这里如果是spring 的话一般会用注入的方法
    Product p ;

    public FactoryMainTest(Product p) {
        this.p = p;
    }

    public void Operation(){
        p.Operation();
    }

    public void getPrice(Price p ){
        p.getPrice();
    }

    public static void main(String[] args) {
        Factory factory = new ConcreateFactory();
        ConcreateProduct1 p = (ConcreateProduct1) factory.getInstance();
        FactoryMainTest f  = new FactoryMainTest(p);
        f.Operation();

    }

}


四、那么在spring 中是如何使用工厂方法 

    <bean id = "product1Price" class="com.bitch.design.action.factory.Product1Price"></bean>
    <bean id = "product2Price" class="com.bitch.design.action.factory.Product2Price"></bean>

    <bean id="concreateProduct1" class="com.bitch.design.action.factory.Factory2" factory-method="getInstance">
        <constructor-arg value="com.bitch.design.action.factory.ConcreateProduct1"/>
        <property name="price" ref="product1Price"/>
    </bean>

    <bean id="concreateProduct2" class="com.bitch.design.action.factory.Factory2" factory-method="getInstance">
        <constructor-arg value="com.bitch.design.action.factory.ConcreateProduct1"/>
        <property name="price" ref="product2Price"/>
    </bean>

 当然你也可以使用注解来实现!

测试代码如下

package com.bitch.design.action.factory;

import com.sishuok.es.common.test.BaseIT;
import com.sishuok.es.common.utils.SpringUtils;
import org.junit.Test;

/**
 * @author chenhaipeng
 * @version 1.0
 * @date 2015/10/30 21:38
 */
public class SpringFactoryMainTest extends BaseIT {

    @Test
    public void test() {
//        ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-bitch.xml");
//        ConcreateProduct1 product1 = ctx.getBean("concreateProduct1",ConcreateProduct1.class);

        ConcreateProduct1 product1 = SpringUtils.getBean("concreateProduct1");
        System.out.println(product1);
        product1.getPrice();
    }

}









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园悬赏任务平台对字典管理、论坛管理、任务资讯任务资讯公告管理、接取用户管理、任务管理、任务咨询管理、任务收藏管理、任务评价管理、任务订单管理、发布用户管理、管理员管理等进行集中化处理。经过前面自己查阅的网络知识,加上自己在学校课堂上学习的知识,决定开发系统选择小程序模式这种高效率的模式完成系统功能开发。这种模式让操作员基于浏览器的方式进行网站访问,采用的主流的Java语言这种面向对象的语言进行校园悬赏任务平台程序的开发,在数据库的选择上面,选择功能强大的Mysql数据库进行数据的存放操作。校园悬赏任务平台的开发让用户查看任务信息变得容易,让管理员高效管理任务信息。 校园悬赏任务平台具有管理员角色,用户角色,这几个操作权限。 校园悬赏任务平台针对管理员设置的功能有:添加并管理各种信息,管理用户账户信息,管理任务信息,管理任务资讯公告信息等内容。 校园悬赏任务平台针对用户设置的功能有:查看并修改个人信息,查看任务信息,查看任务资讯公告信息等内容。 系统登录功能是程序必不可少的功能,在登录页面必填的数据有两项,一项就是账号,另一项数据就是密码,当管理员正确填写并提交这二者数据之后,管理员就可以进入系统后台功能操作区。项目管理页面提供的功能操作有:查看任务,删除任务操作,新增任务操作,修改任务操作。任务资讯公告信息管理页面提供的功能操作有:新增任务资讯公告,修改任务资讯公告,删除任务资讯公告操作。任务资讯公告管理页面显示所有任务资讯公告,在此页面既可以让管理员添加新的任务资讯公告信息,也能对已有的任务资讯公告信息执行编辑更新,失效的任务资讯公告信息也能让管理员快速删除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值