工厂方法模式定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
UML类图:
所有工厂模式都用来封装对象的创建。工厂方法模式通过让子类决定改创建的对象是什么,来达到将对象创建的过程封装的目的。
1.Creator所有子类都必须实现这个抽象的factoryMethod()方法。
2.ConcreteCreator实现了factoryMethod(),以实际制造出产品。由它负责创建一个或多个集体产品,只有此类知道如何创建这些产品。
3.所有产品ConcreteProduct必须实现Product,这样就可以使用这个接口,而不是具体的类。
注意:这里说的实现不一定是实现接口,而是泛指超类。
所有工厂模式都用来封装对象的创建。工厂方法模式通过让子类决定改创建的对象是什么,来达到将对象创建的过程封装的目的。这样做的好处是在实例化对象时,只会依赖于接口,而不是具体的类。(设计原则:针对接口编程)
例如:有一个蛋糕工厂,由蛋糕工厂负责生产各种蛋糕(奶油蛋糕、巧克力蛋糕、水果蛋糕、冰欺凌蛋糕等等)
//蛋糕类
public abstract class Cake { protected String name;//名字 public void make() { System.out.println("做蛋糕---"); } public String makeDone() { return name; } }
//巧克力蛋糕
public class ChocolateCake extends Cake { public ChocolateCake() { name = "巧克力蛋糕"; } }
//奶油蛋糕
public class MilkCake extends Cake{ public MilkCake() { name = "巧奶油蛋糕"; } }
//工厂
public abstract class Factory { //1.工厂方法是抽象的。 //2.工厂方法必须返回一个产品。 //3.工厂方法将客户(超类中的代码,例如:toMake())和具体创建产品的代码分隔开来。 abstract Cake createCake(String item); public Cake toMake(String type){ Cake cake = createCake(type); return cake; } }
//蛋糕工厂 利用java反射机制
public class CakeFactory extends Factory{ @Override Cake createCake(String ClassName) { Cake c = null; try { c=(Cake)Class.forName(ClassName).newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return c; } }
//客户端
public class ClientTest { public static void main(String[] args) { //首先先创建一个蛋糕工厂 Factory factory = new CakeFactory(); //由蛋糕店工厂负责生产客户所需要的蛋糕。 Cake cake = factory.toMake("com.csdn.reflectfactory.MilkCake"); Cake cake_ = factory.toMake("com.csdn.reflectfactory.ChocolateCake"); //取出工厂创建的蛋糕 System.out.println(cake.makeDone()); System.out.println(cake_.makeDone()); } }
输出:奶油蛋糕
巧克力蛋糕
反射的好处是如果创建新种类的蛋糕不用修改工厂的代码。
可以看看 没用反射的工厂模式 http://blog.csdn.net/allen_gang/article/details/9033453
相关推荐
Java反射和工厂模式是两种非常重要的编程概念,它们在软件设计和实现中起着关键作用。反射机制允许我们在运行时动态地获取类的信息并操作对象,而工厂模式是一种设计模式,它提供了一种创建对象的最佳方式,使得代码...
总结起来,通过结合Java反射机制,我们可以优化工厂模式,使其在运行时具有更强的动态性,能够根据不同的条件或配置创建不同类型的对象。这在应对需求变化和提高代码可扩展性方面具有显著优势。同时,我们也需要注意...
### Java反射机制详解 #### 一、什么是Java反射? Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用...
### Java反射机制应用详解 #### 一、Java反射机制简介 Java反射机制是Java语言提供的一种能在运行时分析类信息并动态操作对象的功能。通过反射,我们可以在程序运行期间获取类的信息(如类名、方法名等),创建...
Java反射机制是Java语言的一种强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包中的类(如Constructor、Method、Field)以及...
总结,反射工厂是Java中实现动态代码和插件架构的关键技术。通过它,我们可以编写更加灵活、适应性强的程序,使系统能够根据需求和环境的变化进行自我调整。然而,需要注意的是,过度使用反射可能会降低代码的可读性...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得动态性、灵活性和元编程成为可能,从而极大地扩展了Java开发者的工具箱。在Java中,...
本文详尽地论述了Java反射,工厂模式,动态代理模式
结合这两个概念,"反射工厂"的案例可能是在创建对象时,使用工厂模式的逻辑,但在确定要创建哪个类的对象时,不预先硬编码类名,而是通过反射机制获取。例如,假设我们有一个数据库访问对象的接口DAO,有多个不同的...
在Java编程中,"反射+抽象工厂模式"是一种高级的软件设计技巧,它结合了两种强大的设计模式,以实现高度灵活和可扩展的系统。反射允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。...
Java反射机制是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在构建框架和库时尤为有用。本篇文章将...
### Java反射机制详解 #### 一、反射机制是什么 反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地获取类的信息,并且能够动态地创建对象和调用对象的方法。简单来说,反射机制使得Java程序可以...
在Java或其他面向对象的语言中,反射是一种强大的工具,它允许程序在运行时检查类的信息,包括类的方法、属性和构造器,甚至可以在运行时动态创建对象并调用其方法。当结合抽象工厂模式使用时,反射可以用来动态地...
Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类、接口、字段和方法的信息,使得我们可以在不知道对象具体...
Java反射和Spring IOC是Java开发中的两个重要概念,它们在构建灵活、可扩展的应用程序时起着关键作用。本文将深入探讨这两个主题,并提供相关的学习资源。 首先,让我们了解一下Java反射。Java反射机制是Java语言的...
在本篇“java反射机制学习(五):工厂模式”中,我们将探讨如何利用反射与工厂模式结合,提升代码的灵活性和可扩展性。 首先,工厂模式是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。传统的工厂模式...
几个小demo,介绍了反射的几个api操作,最后写了一个简单的Java反射应用:工厂+反射+配置文件。
用反射机制改进的抽象工厂
通过学习这个实践案例,你将更好地理解抽象工厂模式如何工作,以及如何在实际项目中利用Java反射来提高代码的灵活性和可维护性。同时,这也为你提供了在复杂系统中设计和实现可扩展组件的宝贵经验。
几个Java反射和动态代理的小例子。可以学习如何通过Java的反射机制实例化对象、调用对象的方法、操作对象的私有成员变量、改变数组中的某项的值、改变数组大小等;可以学习Java的动态代理模式、学习Java工厂模式以及...