摘要:本文主要向大家介绍了JAVA语言程序设计的工厂模式实现教程,通过具体的实例让大家了解,希望对大家学习JAVA语言程序设计有所帮助。
本文主要向大家介绍了JAVA语言程序设计的工厂模式实现教程,通过具体的实例让大家了解,希望对大家学习JAVA语言程序设计有所帮助。
意图
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
实现
创建接口
public interface Book { String ClassName(); }
创建实体类
public class MathBook implements Book { @Override public String ClassName() { return MathBook.class.getName(); } } public class EnglishBook implements Book { @Override public String ClassName() { return EnglishBook.class.getName(); } }
创建工厂类
public class BookFcatory{ public Book getBook(String name){ switch (name) { case "math": return new MathBook(); case "english": return new EnglishBook(); } return null; } }
使用
public static void main(String... args) { BookFcatory fcatory = new BookFcatory(); Book book = fcatory.getBook("math"); System.out.println(book.ClassName()); book = fcatory.getBook("english"); System.out.println(book.ClassName()); }
结果
I/System.out: com.gjn.opencv.Model$MathBook I/System.out: com.gjn.opencv.Model$EnglishBook
以上就就是一个工厂模式的用法
当有多实体类都要重复的new创建,就可以考虑创建一个工厂类来实现重复的new。
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
补充
关于上面的工厂模式,如果我新增一个方法,就是要在getName中加一个case,不然就无法创建了,这个时候可以考虑使用反射,来实现添加case
这边我加入新的实体类
public static class ChemistryBook implements Book { @Override public String ClassName() { return ChemistryBook.class.getName(); } } public static class PhysicsBook implements Book { @Override public String ClassName() { return PhysicsBook.class.getName(); } } public static class BiologyBook implements Book { @Override public String ClassName() { return BiologyBook.class.getName(); } }
注意 这边我们创建的实体类都加了static,原来的两个类也要加入static,不然调用反射机制的时候会报错
java.lang.InstantiationException: can't instantiate class xxxxx; no empty constructor
使用反射机制修改工厂类
public Object getBook(Class<!--? extends Book--> cls){ Object obj = null; try { obj = Class.forName(cls.getName()).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); } return obj; }
调用方法
public static void main(String... args) { BookFcatory fcatory = new BookFcatory(); Book book = (MathBook) fcatory.getBook(MathBook.class); System.out.println(book.ClassName()); book = (EnglishBook) fcatory.getBook(EnglishBook.class); System.out.println(book.ClassName()); book = (PhysicsBook) fcatory.getBook(PhysicsBook.class); System.out.println(book.ClassName()); book = (ChemistryBook) fcatory.getBook(ChemistryBook.class); System.out.println(book.ClassName()); book = (BiologyBook) fcatory.getBook(BiologyBook.class); System.out.println(book.ClassName()); }
结果
I/System.out: com.gjn.opencv.Model$MathBook I/System.out: com.gjn.opencv.Model$EnglishBook I/System.out: com.gjn.opencv.Model$PhysicsBook I/System.out: com.gjn.opencv.Model$ChemistryBook I/System.out: com.gjn.opencv.Model$BiologyBook
这样我们就是随时增加新的class,也不需要不断的修改工厂类的方法了!
以上就是职坐标整理发布关于JAVA的介绍,先祝大家应该对它有了一定的了解吧,希望这篇文章对大家有一定的帮助!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号