这篇文章主要介绍“Java工厂模式是什么意思”,在日常操作中,相信很多人在Java工厂模式是什么意思问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java工厂模式是什么意思”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
工厂模式:
设计模式是源于生活,人类社会生产从原始的集体生产、私有化、作坊、手工工厂、流水线工程一路发展过来,工厂生产模式成为效率最高的方式。
那么在软件设计中也参考了这种方式:
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。 工厂模式让对象的使用者无需了解具体实现,只需要通过对象工厂直接拿过来用就行了。
Java构架师学习资料:Java构架师技术栈/高并发/高可用/高性能/源码解析
简单工厂模式:
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
工厂(WaterFactory)角色:
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
抽象产品(Water)角色:
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(冰露、农夫山泉、怡宝)角色:
是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
优点:
工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点:
由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
简单工厂模式代码示例:
package demo; /** * 饮用水抽象产品角色 * @author OuYang * */ public interface Water { /** * 获取一个产品 * @return */ public String getWater(); } ------------------------------------ package demo; /** * 冰露实现类 * @author OuYang * */ public class IceDew implements Water{ public String getWater() { return "冰露纯净水"; } } -------------------------------------- package demo; /** * 怡宝实现类 * @author OuYang * */ public class SimpleFactory_Water { public Water getWater(String brand) { if(brand.equals("冰露")) { return new IceDew(); } if(brand.equals("农夫山泉")) { return new NongFu(); } if(brand.equals("怡宝")) { return new YiBao(); } return null; } } -------------------------------------------- package simplefactory_demo; import demo.IceDew; import demo.SimpleFactory_Water; public class TestWater { public static void main(String[] args) { //普通new模式 System.out.println(new IceDew().getWater()); //简单的工厂生产模式(小作坊) //用户本身不再需要了解生产过程,只需要结果 SimpleFactory_Water factory = new SimpleFactory_Water(); System.out.println(factory.getWater("农夫山泉").getWater()); } }
在Spring中,beanFactory就是对象工厂,配置<bean .........> 就相当于代码:
factory.getWater("农夫山泉")
当然,Spring的对象工厂远远没有这么简单。
工厂方法模式:
在简单工厂模式中,由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
很显然,工厂也应该抽象化,再去实现具体品牌的对象工厂,这样就可以在工厂实现类丰富更多的参数和功能。分工更细,可维修性也更高。
import SimpleFactory.Water; /** * 工厂模型 * @author OuYang * */ public interface Factory { //工厂的产品出口 Water getWater(); } -------------------------------------------- package methodfactory; import SimpleFactory.NongFu; import SimpleFactory.Water; /** * 农夫山泉生产工厂 * @author OuYang * */ public class NongFuFactory implements Factory{ public Water getWater() { return new NongFu(); } } -------------------------------------------- package methodfactory; package abstractfactory; import SimpleFactory.IceDew; import SimpleFactory.NongFu; import SimpleFactory.YiBao; /** * 测试类 * @author OuYang * */ public class FactoryTest { public static void main(String[] args) { System.out.println(new YiBaoFactory().getWater().getWater()); } }
抽象工厂模式:
在工厂方法模式中,我们无需new各种各样的对象来使用,只需要new一个对象工厂即可获得我们想要的对象。
但是这样只是解决了功能聚集在同一个工厂的问题,解决了改需求带来的麻烦,但是我们仍然要new相应的对象工厂,程序的复杂度依然存在。
创建抽象工厂,有公共属性和抽象方法。
实现类中实现冰露、农夫、怡宝的生产工厂。
这样既解决的代码的复杂性,又可以在工厂实现类中设置不同的参数。
/** * 抽象工厂 * @author OuYang * */ public abstract class AbstractFactory { //公共属性和逻辑,容量 int volume; //获取怡宝 public abstract YiBao getYiBao(); //获得冰露 public abstract IceDew getIecDew(); //获得农夫山泉 public abstract NongFu getNongFu(); } ------------------------------- package abstractfactory; import SimpleFactory.IceDew; import SimpleFactory.NongFu; import SimpleFactory.YiBao; /** * 抽象工厂实现类 * @author OuYang * */ public class WaterFactory extends AbstractFactory{ @Override public YiBao getYiBao() { //设置为1升 this.volume=1; return new YiBao(); } @Override public IceDew getIecDew() { //设置为2升 return new IceDew(); } @Override public NongFu getNongFu() { //设置为3升 return new NongFu(); } } ------------------------------------ package simplefactory_demo; import abstractfactory.WaterFactory; /** *测试类 */ public class AbstractFactoryTest { public static void main(String[] args) { WaterFactory factory = new WaterFactory(); System.out.println(factory.getIecDew().getWater());
到此,关于“Java工厂模式是什么意思”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。