1.首先来看最普通的工厂模式

1.1 定义一个需要工厂生产的java类

package javaee.net.cn.factory;

class Person{
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [age=" + age + ", name=" + name + "]";
} }

1.2 写一个最普通的工厂

package javaee.net.cn.factory;

import org.junit.Test;
public class BeanFactory { @Test
public void test() throws Exception{
Person person = createPerson();
System.out.println(person.toString());
}
public static Person createPerson(){
return new Person();
}
}

上面的是最普通的工厂模式,不过使用new关键字来创建的对象,如果代码中出现很多这种new的代码(POJO除外)

那么 这种非常不容易维护和扩展。

2.对工厂模式优化 -->反射工厂

package javaee.net.cn.factory;

import org.junit.Test;
public class BeanFactory {
@SuppressWarnings("unchecked")
public static <T> T getBean(String className,Class<T> Type) throws Exception{
Class<T> clz = (Class<T>) Class.forName(className);
Object obj = clz.newInstance();//进行实例化操作,要求类中必须存在无参的构造方法
if(!Type.isInstance(obj)){
throw new Exception("对象和内容不兼容");
}
return (T)obj;
} @Test
public void test() throws Exception{
Person person = getBean("javaee.net.cn.factory.Person",Person.class);
System.out.println(person.toString());
}
}
Tip:getBean是一个泛型方法,可以在编译期间检查所要传入的对象和想要获取的对象是否一致反射工厂虽然没有了虽然对普通工厂有一些改善(避免了new关键字)但是还是出现了硬编码"javaee.net.cn.factory.Person"
3.利用Annotation改善反射工厂
3.1先定义一个注解@FactoryFlag

package javaee.net.cn.factory.strategy;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME)
public @interface FactoryFlag { // 定义一个Annotation
public String className();//定义一个className()属性
}
3.2把注解应用到BeanFactory 
package javaee.net.cn.factory;

import javaee.net.cn.factory.strategy.FactoryFlag;

import org.junit.Test;
@FactoryFlag(className="javaee.net.cn.factory.Person")
public class BeanFactory {
@SuppressWarnings("unchecked")
public static <T> T getBean(String className,Class<T> Type) throws Exception{
Class<T> clz = (Class<T>) Class.forName(className);
Object obj = clz.newInstance();//进行实例化操作,要求类中必须存在无参的构造方法
if(!Type.isInstance(obj)){
throw new Exception("对象和内容不兼容");
}
return (T)obj;
} @Test
public void test() throws Exception{
Class<?> cls = BeanFactory.class;
FactoryFlag factoryFlag = cls.getAnnotation(FactoryFlag.class);
String className = factoryFlag.className();
Person person = BeanFactory.getBean(className,Person.class);
System.out.println(person.toString());
}
}

这样 我们的代码里面就没有硬编码了 而是写在了注解上,@FactoryFlag(className="javaee.net.cn.factory.Person")

当然 也可以写在配置文件里,然后读进来,我们在这里是写在注解上 然后去读取注解

里面用到的一些放射方法(获取注解、创建对象) 大家可以去参考JDK的API

上面的Demo Bean工厂只生产了一个对象,其实:工厂可以生产一系列对象(这才叫工厂吗)

这样 我们替换工厂的时候 可以直接替换掉那一系列对象,工厂也可以利用多态 写成抽象工厂

JDK设计模式之——工厂模式的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  5. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

  6. php设计模式:工厂模式

    php设计模式:工厂模式 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明 ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  8. java 设计模式之工厂模式与反射的结合

    工厂模式: /**  * @author Rollen-Holt 设计模式之 工厂模式  */   interface fruit{     public abstract void eat(); } ...

  9. C#学习之设计模式:工厂模式

    最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...

随机推荐

  1. java、php、.net关于web开发的区别

    一提到web开发,目前在世界上流行性的三个帮派就是php,java和asp.net,这个世界上的百分之99的网站或者类似的应用都是由这三种语言的开发,这里请原谅我忽视某些小众语言如python之类.三 ...

  2. stm32定时器时钟以及中间对齐模式

    在永磁同步电机的控制中,需要对电机的三相定子施加一定的电压,才能控制电机转动.现在用的较多的是SVPWM(SVPWM的具体原理会在后面另写一篇博客说明),要想产生SVPWM波形,需要控制的三相电压呈如 ...

  3. LVS的DR模式测试案例<仅个人记录>

    初始概念 大家都知道LVS,是章文嵩博士创建的,所以首先推一下主站吧!http://zh.linuxvirtualserver.org/ LVS集群分为三层结构: 负载调度器(load balance ...

  4. 自己搭建git服务器

    1.安装git 2.创建git用户,给权限(git目录下) 3.设置公钥 4.初始化git仓库 5.给权限(仓库) 连接到本地

  5. java数据结构至对称矩阵压缩存储

    刚刚刷java选择题,遇到的对称矩阵压缩存储问题,我们知道对称矩阵是aij=aji的矩阵,压缩存储可以采用一维数组和二维数组存储. 此处只讨论一维数组存储的形式,设数组下标从0开始,对称矩阵为n维矩阵 ...

  6. [转] Shader Blending

    引用:1.Unity3D shader Blending2.[风宇冲]Unity3D教程宝典之Shader篇:第十三讲 Alpha混合 混合(Blending)是计算机呈现渲染结果的最后阶段,每一个像 ...

  7. 图解HTTP第十章

    Web 的攻击技术 1>在客户端即可篡改请求 2>针对 Web 应用的攻击模式 3>因输出值转义不完全引发的安全漏洞 [1]跨站脚本攻击 [2]SQL 注入攻击 [3]OS 命令注入 ...

  8. 20155312 张竞予 Exp2 后门原理与实践

    Exp2 后门原理与实践 目录 基础问题回答 (1)例举你能想到的一个后门进入到你系统中的可能方式? (2)例举你知道的后门如何启动起来(win及linux)的方式? (3)Meterpreter有哪 ...

  9. Spring-bean的自动装配

    bean的自动装配:可以让一个bean对象自动的引用其他bean byType:按照类型进行装配.  缺点:如果在IOC容器中存在多个类型相同的bean的时候,会出现异常. <bean id=& ...

  10. linux shell数组赋值方法(常用)

    http://blog.csdn.net/shaobingj126/article/details/7395161 Bash中,数组变量的赋值有两种方法: (1) name = (value1 ... ...