当前位置: 首页 > 科技观察

工厂设计模式案例详解,不服就来争论!

时间:2023-03-18 21:56:37 科技观察

本文转载自微信公众号《Java极客技术》,作者鸭血范。转载本文请联系Java极客技术公众号。工厂模式(FactoryPattern)是Java中最常用的设计模式之一,今天就来深入分析一下。一、简介从名字上看,顾名思义,就是创造产品。按类别分为简单工厂模式、工厂方法模式和抽象工厂模式。主要作用是帮助我们单独提取对象的实例化操作,优化系统架构,增强系统。可扩展性。接下来,我们来看看每种模式的使用方法。2.简单工厂模式简单工厂模式拥有最简单的对象创建和管理方式,因为它只是简单地将不同类型对象的创建进行了一层薄薄的封装。此模式通过将类型传递给工厂来指定要创建的对象。创建一个接口publicinterfaceProduct{voidoperation1();voidoperation2();}创建一个实现接口publicclassConcreateProductAimplementsProduct{@Overridepublicvoidoperation1(){System.out.println("ProductA,performtask1");}@Overridepublicvoidoperation2()的实体类{System.out.println("产品A,执行任务2");}}publicclassConcreateProductBimplementsProduct{@Overridepublicvoidoperation1(){System.out.println("产品B,执行任务1");}@Overridepublicvoidoperation2(){System.出去。println("ProductB,performtask2");}}根据给定信息创建工厂生成实体类的对象publicclassSimpleFactory{//使用create方法获取shape类型的对象publicProductcreate(StringproductType){if(productType==null){returnnull;}if(productType.equalsIgnoreCase("productA")){returnnewConcreateProductA();}if(productType.equalsIgnoreCase("productB")){returnnewConcreateProductB();}returnnull;}}写客户端测试类,使用这个工厂通过传递类型信息获取实体类的对象publicclassFactoryPatternDemo{publicstaticvoidmain(String[]args){Si??mpleFactorysimpleFactory=newSimpleFactory();//获取产品ctA的对象ProductproductA=simpleFactory.create("productA");//调用productA的operation1和operation2方法productA.operation1();productA.operation2();//获取productB的对象ProductproductB=simpleFactory.create("productB");//调用productB的operation1和operation2方法productB.operation1();productB.operation2();}}执行程序,输出结果:productA,执行任务1productA,执行任务2productB、执行任务1产品B、执行任务2当然你也可以改进创建对象的方式,将SimpleFactory类的对象创建方式改为如下方式:publicclassSimpleFactory{//反射机制获取实体类publicTcreateByClazzName(Classclazz){Tobj=null;try{obj=(T)Class.forName(clazz.getName()).newInstance();}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}returnobj;}}这样做的好处是在添加新产品时,不需要修改工厂类。调用时,可以通过以下方式获取对象!Productproduct=newSimpleFactory().create("类名.class");3.工厂方法工厂方法模型相对于工厂负责生产所有产品的简单工厂模型,将生成特定产品的任务分配给特定的产品工厂创建一个工厂接口publicinterfaceFactoryProduct{Productcreate();}创建一个实现接口publicclassConcreateFactoryAimplementsFactoryProduct{@OverridepublicProductcreate(){returnnewConcreateProductA();}}publicclassConcreateFactoryBimplementsFactoryProduct{@OverridepublicBactoryAimplements(){create}Product类使用客户端写的工厂类获取通过传递类型信息获取实体类的对象publicclassFactoryPatternDemo{publicstaticvoidmain(String[]args){//获取productA的对象ProductproductA=newConcreateFactoryA().create();//调用productA的operation1和operation2方法productA。operation1();productA.operation2();//获取productB的对象ProductproductA=newConcreateFactoryB().create();//调用productB的operation1和operation2方法productB.operation1();productB.operation2();}}执行程序,输出结果:产品A,执行任务1产品A,执行任务2产品B,执行任务1产品B,执行任务2四、抽象工厂模型抽象工厂模型主要是针对概念提出的产品系列。提供创建一系列相关或相互依赖的对象的方法。为形状创建一个接口publicinterfaceShape{voiddraw();}创建一个实现接口publicclassRectangleimplementsShape{@Overridepublicvoiddraw(){System.out.println("InsideRectangle::draw()method.");}}publicclassSquareimplementsShape@Overridepublicvoiddraw(){System.out.println("InsideSquare::draw()方法。");}}publicclassCircleimplementsShape{@Overridepublicvoiddraw(){System.out.println("InsideCircle::draw()方法。");}}isColor创建一个接口publicinterfaceColor{voidfill();}创建一个实现接口的实体类{@Overridepublicvoidfill(){System.out.println("InsideGreen::fill()method.");}}publicclassBlueimplementsColor{@Overridepublicvoidfill(){System.out.println("InsideBlue::fill()method.");}}是Color用Shape对象创建一个抽象类得到工厂publicabstractclassAbstractFactory{publicabstractColorgetColor(Stringcolor);publicabstractShapegetShape(Stringshape);}创建一个扩展AbstractFactory的工厂类,根据给定的信息生成实体类对象)){returnnewCircle();}elseif(shapeType.equalsIgnoreCase("RECTANGLE")){returnnewRectangle();}elseif(shapeType.equalsIgnoreCase("SQUARE")){returnnewSquare();}returnnull;}@OverridepublicColorgetColor(Stringcolor){returnull;}}publicclassColorFactoryextendsAbstractFactory{@OverridepublicShapegetShape(StringshapeType){returnull;}@OverridepublicColorgetColor(Stringcolor){if(color==null){returnnull;}if(color.equalsIgnoreCase("RED")){returnnewRed();}elseif(color.equalsIgnoreCase("GREEN")){returnnewGreen();}elseif(color.equalsIgnoreCase("BLUE")){returnnewBlue();}returnnull;}}创建一个工厂创建者/生成器类,通过获取工厂传递形状或颜色信息publicclassFactoryPro生产者{publicstaticAbstractFactorygetFactory(Stringchoice){if(choice.equalsIgnoreCase("SHAPE")){returnnewShapeFactory();}elseif(choice.equalsIgnoreCase("COLOR")){returnnewColorFactory();}returnnull;}}使用FactoryProducer获取AbstractFactory,通过传递类型信息获取实体类的对象publicclassAbstractFactoryPatternDemo{publicstaticvoidmain(String[]args){//获取形状工厂AbstractFactoryshapeFactory=FactoryProducer.getFactory("SHAPE");//获取形状为圆形的对象Shapeshape1=shapeFactory.getShape("CIRCLE");//调用Circle的draw方法shape1.draw();//获取形状为Rectangle的对象Shapeshape2=shapeFactory.getShape("RECTANGLE");//调用Circle的draw方法Rectangleshape2.draw();//获取形状为Square的对象Shapeshape3=shapeFactory.getShape("SQUARE");//调用Square的draw方法shape3.draw();//获取颜色工厂AbstractFactorycolorFactory=FactoryProducer.getFactory("COLOR");//获取颜色为红色的对象Colorcolor1=colorFactory.getColor("RED");//调用红色的填充方法color1.fill();//得到颜色为绿色的对象Colorcolor2=colorFactory.getColor("Green");//调用绿色的填充方法color2.fill();//得到一个颜色为蓝色的对象Colorcolor3=colorFactory.getColor("BLUE");//调用蓝色的填充方法color3.fill();}}执行程序并输出结果:InsideCircle::draw()方法。InsideRectangle::draw()方法。InsideSquare::draw()方法。InsideRed::fill()方法。InsideGreen::fill()方法。InsideBlue::fill()方法。应用工厂模式在实际开发中使用的非常频繁,比如JDK中的日历操作。国际化时,使用简单工厂模式获取本地语言写一个获取测试,如下:publicstaticvoidmain(String[]args){//获取日历操作类Calendarcalendar=Calendar.getInstance();intyear=calendar.get(Calendar.YEAR);//添加1intmonth=calendar得到月份。get(Calendar.MONTH)+1;intday=calendar.get(Calendar.DAY_OF_MONTH);inthour=calendar.get(Calendar.HOUR_OF_DAY);intminute=calendar.get(Calendar.MINUTE);intseconds=calendar.get(日历。SECOND);//1-7代表--Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturdayintweek=calendar.get(calendar.DAY_OF_WEEK);//年-月-日System.out.println("年="+year);System.out.println("month="+month);System.out.println("day="+day);//时分秒System.out.println("hour="+小时);System.out.println("分钟="+分钟);System.out.println("seconds="+seconds);//周System.out.println("week="+week);}进入getInstance()方法。获取日历类型时,内容如下:6.总结在工厂模式中,重要的是工厂类,而不是产品类。产品类可以有多种形式,多级继承或单一类都可以。但是要明确一点,工厂模式的接口只会返回一个类型的实例,这一点在设计产品类的时候需要注意。最好有父类或者通用接口。上面介绍的三种工厂模式都有各自的应用场景,在实际应用中都能解决问题,满足需求!七、参考资料1、菜鸟教程-工厂模式2、博客园-alpha_panda-设计模式之工厂模式