JDK设计模式之——工厂模式
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设计模式之——工厂模式的更多相关文章
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
- 5. 星际争霸之php设计模式--抽象工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 3. 星际争霸之php设计模式--简单工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- iOS 设计模式之工厂模式
iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...
- 设计模式之工厂模式(Factory)
设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...
- php设计模式:工厂模式
php设计模式:工厂模式 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- java 设计模式之工厂模式与反射的结合
工厂模式: /** * @author Rollen-Holt 设计模式之 工厂模式 */ interface fruit{ public abstract void eat(); } ...
- C#学习之设计模式:工厂模式
最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...
随机推荐
- 把多个字符串里面的项写到不同的对象中,然后在push到一个数组中
otherUserNames: "甲,乙,丙,丁"otherUserIds: "10008750,10008711,10003348,10008747" oth ...
- java中实现对list的模糊查询
比如我有下面这样一个List,里面存放的是多个Employee对象.然后我想对这个List进行按照Employee对象的名字进行模糊查询.有什么好的解决方案么?比如我输入的查询条件为“wang”,那么 ...
- Python MD5算法使用
## md5算法简介 1. **简介** MD5消息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值 ...
- python中的深浅copy
https://www.cnblogs.com/Eva-J/p/5534037.html 转自Eva_J 分析的特别好
- pycharm:terminal中显示乱码的解决方式
pycharm:terminal中显示乱码的解决方式
- [C#.Net]Window服务调用外部程序
最近遇到要做回传服务内增加开关,可以自定义运行一些脚本已方便收集PC状态,发现Bat始终无法运行,上网找了半天才发现和Session0有关,也就是程序有不同级别的访问权限,Vista以上版本为了安全因 ...
- window环境下修改postgrep密码
本机window7 64位系统,安装的PostgreSQL 9.3 默认安装是没有设置密码的,使用pgAdmin III登陆需要登陆密码. 我们使用默认安装的工具 SQL Shell 来操作. 我们依 ...
- AndroidStudio 问题点 - app:preFUNDebugAndroidTestBuild
Error:Execution failed for task ':app:preFUNDebugAndroidTestBuild'. >Conflictwith dependency 'com ...
- Redis与SpringBoot整合
添加Redis相关jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...
- Python_day9
多继承: python支持,但不建议使用 dir(): 获取类或者对象的方法和属性 __mro__:获取类的继承顺序 class A(object): def run(self): print('ru ...