您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 简单工厂模式与工厂模式和抽象工厂模式
Java设计模式圣经连载(01)-简单工厂模式2006-12-0314:33:04标签:java设计模式1.1简单工厂(SimpleFactory)模式简单工厂模式是类的创建,又叫静态工厂方法(StaticFactoryMethord)模式。简单工厂模式是由一个工厂对象决定创造哪一种产品类的实例。1.1.1工厂模式的几种形态工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态的决定将哪一个类实例化,工厂模式有以下几种形态:简单工厂(SimpleFactory)模式:又称静态工厂方法(StaticFactoryMethord)模式。工厂方法(FactoryMethod)模式:又称多态性工厂(PolymorphicFactory)模式或虚拟构造子(VirtualConstructor)模式。抽象工厂(AbstractFactory)模式:又称工具箱(Kit或Toolkit)模式。下图所示的就是简单工厂模式的简略类图。简单工厂模式,或称静态工厂方法模式,是不同工厂方法模式的一个特殊实现。在Java语言中,通常的工厂方法模式不能通过设计功能的退化给出静态工厂方法模式。1.1.2简单工厂模式的引进(一般模式)比如有一个农场,生产各种水果,有苹果(Apple)、草莓(Strawberry)、葡萄(Grape);农场的园丁(FruitGardener)要根据客户的需求,提供相应的水果。下面看看是如何用简单工厂模式实现这个过程的,如下图:此模式的实现源码如下:1.1.2.1产品接口-水果接口:Fruit.javapackagecom.lavasoft.patterns.simplefactory.ybgc;/***CreatedbyIntelliJIDEA.*FileName:Fruit.java*User:LavaSoft*Date:2006-12-1*Time:0:26:51*《Java与模式》(--阎宏博士著)读书笔记*工厂模式模式--简单工厂模式--一般模式*ReadMe:抽象产品角色:工厂的水果产品接口--水果*/publicinterfaceFruit{/***种植*/voidplant();/***生长*/voidgrow();/***收获*/voidharvest();}1.1.2.2产品-平果类:Apple.javapackagecom.lavasoft.patterns.simplefactory.ybgc;/***CreatedbyIntelliJIDEA.*FileName:Apple.java*User:LavaSoft*Date:2006-12-1*Time:0:47:25*《Java与模式》(--阎宏博士著)读书笔记*工厂模式模式--简单工厂模式--一般模式*ReadMe:水果工厂的产品:苹果*/publicclassAppleimplementsFruit{privateinttreeAge;/***种植*/publicvoidplant(){System.out.println(Applehasbeenplanted.);}/***生长*/publicvoidgrow(){System.out.println(Appleisgrowing...);}/***收获*/publicvoidharvest(){System.out.println(Applehasbeenharvested.);}/***@return返回树龄*/publicintgetTreeAge(){returntreeAge;}/***设置树龄*/publicvoidsetTreeAge(inttreeAge){this.treeAge=treeAge;}}1.1.2.3产品-草莓类:Strawberry.javapackagecom.lavasoft.patterns.simplefactory.ybgc;/***CreatedbyIntelliJIDEA.*FileName:Strawberry.java*User:LavaSoft*Date:2006-12-1*Time:0:45:09*《Java与模式》(--阎宏博士著)读书笔记*工厂模式模式--简单工厂模式--一般模式*ReadMe:水果工厂的产品:草莓*/publicclassStrawberryimplementsFruit{/***生长*/publicvoidgrow(){System.out.println(Strawberryisgrowing...);}/***收获*/publicvoidharvest(){System.out.println(Strawberryhasbeenharvested.);}/***种植*/publicvoidplant(){System.out.println(Strawberryhasbeenplanted.);}/***辅助方法*/publicstaticvoidlog(Stringmsg){System.out.println(msg);}}1.1.2.4产品-葡萄类:Grape.javapackagecom.lavasoft.patterns.simplefactory.ybgc;/***CreatedbyIntelliJIDEA.*FileName:Grape.java*User:LavaSoft*Date:2006-12-1*Time:0:36:56*《Java与模式》(--阎宏博士著)读书笔记*工厂模式模式--简单工厂模式--一般模式*ReadMe:水果工厂的产品:葡萄*/publicclassGrapeimplementsFruit{privatebooleanseedless;//是否有籽/***种植*/publicvoidplant(){System.out.println(Grapehasbeenplanted.);}/***生长*/publicvoidgrow(){System.out.println(Grapeisgrowing...);}/***收获*/publicvoidharvest(){System.out.println(Grapehasbeenharvested.);}/***@return是否有籽*/publicbooleangetSeedless(){returnseedless;}/***有无籽的赋值方法*/publicvoidsetSeedless(booleanseedless){this.seedless=seedless;}/***辅助方法*/publicstaticvoidlog(Stringmsg){System.out.println(msg);}}1.1.2.5工厂-园丁类:FruitGardener.javapackagecom.lavasoft.patterns.simplefactory.ybgc;/***CreatedbyIntelliJIDEA.*FileName:FruitGardener.java*User:LavaSoft*Date:2006-12-1*Time:1:03:27*《Java与模式》(--阎宏博士著)读书笔记*工厂模式模式--简单工厂模式--一般模式*ReadMe:工厂类角色:水果园丁,生产水果产品*/publicclassFruitGardener{/***静态工厂方法*@paramwhich:具体的产品名称*@return一个水果对象*@throwsBadFruitException*/publicstaticFruitfactory(Stringwhich)throwsBadFruitException{if(which.equalsIgnoreCase(apple)){returnnewApple();}elseif(which.equalsIgnoreCase(strawberry)){returnnewStrawberry();}elseif(which.equalsIgnoreCase(grape)){returnnewGrape();}else{thrownewBadFruitException(Badfruitrequest);}}}1.1.2.6工厂异常定义类:BadFruitException.javapackagecom.lavasoft.patterns.simplefactory.ybgc;/***CreatedbyIntelliJIDEA.*FileName:BadFruitException.java*User:LavaSoft*Date:2006-12-1*Time:1:04:56*《Java与模式》(--阎宏博士著)读书笔记*工厂模式模式--简单工厂模式--一般模式*ReadMe:工厂的异常处理类*/publicclassBadFruitExceptionextendsException{publicBadFruitException(Stringmsg){super(msg);//调用父类的构造方法}}1.1.2.7一般工厂模式的测试类packagecom.lavasoft.patterns.simplefactory.ybgc;/***CreatedbyIntelliJIDEA.*FileName:TestApp.java*User:LavaSoft*Date:2006-12-1*Time:1:12:08*《Java与模式》(--阎宏博士著)读书笔记*工厂模式模式--简单工厂模式--一般模式*ReadMe:一般工厂模式的测试类*/publicclassTestApp{/***测试方法*/privatevoidtest(StringfruitName){try{Fruitf=FruitGardener.factory(fruitName);System.out.println(恭喜!生产了一个水果对象:+fruitName);}catch(BadFruitExceptione){System.out.println(对不起!工厂目前不能生产你所要的产品:+fruitName);System.out.println(e.getMessage());//输出异常信息e.printStackTrace();//输出异常堆栈信息}}/***应用入口方法*/publicstaticvoidmain(Stringargs[]){TestAppt=newTestApp();t.test(apple);t.test(grape);t.test(strawberry);t.test(car);//此处会抛异常,水果工厂能生产car(轿车)吗!哈哈哈哈...}}1.1.2.8测试运行结果恭喜!生产了一个水果对象:apple恭喜!生产了一个水果对象:grape恭喜!生产了一个水果对象:strawberry对不起!工厂目前不能生产你所要的产品:carBadfruitrequestcom.lavasoft.patterns.simplefactory.ybgc.BadFruitException:Badfruitrequestatcom.lavasoft.patterns.simplefactory.ybgc.FruitGardener.factory(FruitGardener.java:28)atcom.lavasoft.patterns.simplefactory.ybgc.TestApp.test(TestApp.java:19)atcom.lavasoft.patterns.simplefactory.ybgc.TestApp.main(TestApp.java:37)atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMeth
本文标题:简单工厂模式与工厂模式和抽象工厂模式
链接地址:https://www.777doc.com/doc-4475379 .html