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. Python中__init__和self的意义和作用

    由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去.以学生类为例,通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑 ...

  2. servlet3异步原理与实践

    一.什么是Servlet servlet 是基于 Java 的 Web 组件,由容器进行管理,来生成动态内容.像其他基于 Java 的组件技术一样,servlet 也是基于平台无关的 Java 类格式 ...

  3. 关于TCP窗口大小

    窗口字段 TCP Window字段用于接收端通知发送端:接收端当前能够接收的字节数(即当前允许发送端发送的字节数).在TCP Header中占有16bit长度,如下所示 0 1 2 3 0 1 2 3 ...

  4. NC 部署问题

    1.was环境部署日志  IBM/WEBSPHERE/APPSERVER/PRORFILES/APPSRV01/LOGS/SERVER1/ 

  5. 使用Tenorshare iCareFone for mac为iPhone做系统修复

    tenorshare icarefonemac中文版采用一键式方法来保护,修理,清洁,优化并最终加快您的iPhone,iPad和iPod的速度.它可以帮助您轻松解决所有iOS问题,并让您的iPhone ...

  6. 构建你的spring boot代码

    Spring boot不需要任何特定的代码布局来工作.然而,有一些最佳实践可以帮助您. 1.避免使用缺省包 当一个类不包含包声明时,它被认为是在“缺省包”中.“默认包”的使用通常是不鼓励的,应该避免. ...

  7. 微信小程序开发之搞懂flex布局2——flex container

    容器的概念,是用来包含其它容器(container)和项目(item). flex container——flex容器 A flexbox layout is defined using the fl ...

  8. sklearn svm基本使用

    SVM基本使用 SVM在解决分类问题具有良好的效果,出名的软件包有libsvm(支持多种核函数),liblinear.此外python机器学习库scikit-learn也有svm相关算法,sklear ...

  9. Numpy与Matplotlib

    一.Numpy numpy支持大量的维度数组和矩阵运算,对数组运算提供了大量的数学函数库! numpy比Python列表更具优势,其中一个优势便是速度.在对大型数组执行操作时,numpy的速度比Pyt ...

  10. 解决Chrome 70及以上版本的证书问题:Failed to load resource: net::ERR_CERT_SYMANTEC_LEGACY

    1.桌面必须要有Chrome 快捷方式 2.进入快捷方式属性 3.修改目标为:"C:\Program Files (x86)\Google\Chrome\Application\chrome ...