- 浏览: 428537 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (170)
- java (77)
- javascript (5)
- jsp (1)
- servlet (6)
- struts (8)
- hibernate (3)
- spring (4)
- ajax (5)
- jquery (3)
- apache cxf (0)
- ext.js (1)
- hadoop (0)
- android (0)
- html5 (2)
- linux (5)
- flex (1)
- tomcat (1)
- jboss (0)
- nginx (0)
- mysql (16)
- sql server (3)
- oracle (4)
- div+css (0)
- mybatis (4)
- design patterns (22)
- xml (2)
- postgresql (3)
- velocity (1)
- freemarker (1)
- kendo-ui (2)
- ibatis (1)
- socket (1)
- C and C++ (1)
- C# (2)
- 程序设计----算法 (0)
- jersey (1)
- dd (0)
- perl (1)
- shell (0)
最新评论
-
书策稠浊:
兄弟,这tm是Java?
java调用百度地图和谷歌地图 -
fengyunlouyanyu:
jquery----删除指定id的div下的img -
yangjianzhouctgu:
Neoman 写道hi,我看你引入了kendo.web.min ...
kendo-ui中kendoGrid的用法 -
Neoman:
hi,我看你引入了kendo.web.min.js 这个js, ...
kendo-ui中kendoGrid的用法 -
yangjianzhouctgu:
llscp 写道这是JS吧...对的呀
java调用百度地图和谷歌地图
给定一个工厂类,用这个工厂类造出一堆对象来,这些对象对应的类实现了同一个接口
Human.java为接口类,具体代码如下:
Human接口的具体实现类为:
BlackHuman.java代码如下:
WhiteHuman.java代码如下:
YellowHuman.java代码如下:
工厂类HumanFactory.java代码如下:
工厂类中用到的工具类ClassUtils.java代码如下:
工厂类的调用类NvWa.java代码如下:
运行结果如下:
Human.java为接口类,具体代码如下:
package com.designPattern.factoryMethod; public interface Human { public void laugh(); public void cry(); public void talk(); }
Human接口的具体实现类为:
BlackHuman.java代码如下:
package com.designPattern.factoryMethod; public class BlackHuman implements Human{ @Override public void laugh() { System.out.println("黑色人种会笑!"); } @Override public void cry() { System.out.println("黑色人种会哭!"); } @Override public void talk() { System.out.println("黑色人种会交谈!"); } }
WhiteHuman.java代码如下:
package com.designPattern.factoryMethod; public class WhiteHuman implements Human{ @Override public void laugh() { System.out.println("白色人种会笑!"); } @Override public void cry() { System.out.println("白色人种会哭!"); } @Override public void talk() { System.out.println("白色人种会交谈!"); } }
YellowHuman.java代码如下:
package com.designPattern.factoryMethod; public class YellowHuman implements Human{ @Override public void laugh() { System.out.println("黄色人种会笑!"); } @Override public void cry() { System.out.println("黄色人种会哭!"); } @Override public void talk() { System.out.println("黄色人种会交谈!"); } }
工厂类HumanFactory.java代码如下:
package com.designPattern.factoryMethod; import java.util.List; import java.util.Random; public class HumanFactory { public static Human createHuman(Class c){ Human human = null; try{ human = (Human)Class.forName(c.getName()).newInstance(); }catch(Exception e){ e.printStackTrace(); } return human; } public static Human createHuman(){ Human human = null; List<Class> concreteHumanList = ClassUtils.getAllClassByInterface(Human.class); Random random = new Random(); int rand = random.nextInt(concreteHumanList.size()); human = createHuman(concreteHumanList.get(rand)); return human; } }
工厂类中用到的工具类ClassUtils.java代码如下:
package com.designPattern.factoryMethod; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; public class ClassUtils { @SuppressWarnings("rawtypes") public static List<Class> getAllClassByInterface(Class c){ List<Class> returnClassList = new ArrayList<Class>(); if(c.isInterface()){ String packageName = c.getPackage().getName(); try{ List<Class> allClass = getClasses(packageName); for(int i=0;i<allClass.size();i++){ //isAssignableFrom用来判断一个类和另一个类是否相同或是另一个类的超类或接口 //这里的两个if语句是找出Human接口的所有实现类 if(c.isAssignableFrom(allClass.get(i))){ if(!c.equals(allClass.get(i))){ returnClassList.add(allClass.get(i)); } } } }catch(Exception e){ e.printStackTrace(); } } return returnClassList; } private static List<Class> getClasses(String packageName) throws ClassNotFoundException,IOException { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); String path = packageName.replace('.', '/'); //注意:这里的path中不能有空格,否则会被解析为%20,将会出现错误 Enumeration<URL> resources = classLoader.getResources(path); List<File> dirs = new ArrayList<File>(); while(resources.hasMoreElements()){ URL resource = resources.nextElement(); dirs.add(new File(resource.getFile())); } ArrayList<Class> classes = new ArrayList<Class>(); for(File directory:dirs){ classes.addAll(findClasses(directory,packageName)); } return classes; } private static List<Class> findClasses(File directory,String packageName) throws ClassNotFoundException{ List<Class> classes = new ArrayList<Class>(); if(!directory.exists()){ return classes; } File[] files = directory.listFiles(); for(File file:files){ if( file.isDirectory()){ assert !file.getName().contains("."); classes.addAll(findClasses(file, packageName+"."+file.getName())); }else if(file.getName().endsWith(".class")){ classes.add(Class.forName(packageName+'.'+file.getName().substring(0, file.getName().length()-6))); } } return classes; } }
工厂类的调用类NvWa.java代码如下:
package com.designPattern.factoryMethod; public class NvWa { public static void main(String[] args) throws Exception{ System.out.println("----------------造出的第一批人:白人---------------------"); Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class); whiteHuman.laugh(); whiteHuman.cry(); whiteHuman.talk(); System.out.println("----------------造出的第二批人:黑人---------------------"); Human blackHuman = HumanFactory.createHuman(BlackHuman.class); blackHuman.laugh(); blackHuman.cry(); blackHuman.talk(); System.out.println("----------------造出的第三批人:黄色人种---------------------"); Human yellowHuman = HumanFactory.createHuman(YellowHuman.class); yellowHuman.laugh(); yellowHuman.cry(); yellowHuman.talk(); for(int i=0;i<10;i++){ System.out.println("工厂造人"); Human human = HumanFactory.createHuman(); human.cry(); human.laugh(); human.talk(); } } }
运行结果如下:
----------------造出的第一批人:白人--------------------- 白色人种会笑! 白色人种会哭! 白色人种会交谈! ----------------造出的第二批人:黑人--------------------- 黑色人种会笑! 黑色人种会哭! 黑色人种会交谈! ----------------造出的第三批人:黄色人种--------------------- 黄色人种会笑! 黄色人种会哭! 黄色人种会交谈! 工厂造人 黄色人种会哭! 黄色人种会笑! 黄色人种会交谈! 工厂造人 黄色人种会哭! 黄色人种会笑! 黄色人种会交谈! 工厂造人 白色人种会哭! 白色人种会笑! 白色人种会交谈! 工厂造人 黄色人种会哭! 黄色人种会笑! 黄色人种会交谈! 工厂造人 白色人种会哭! 白色人种会笑! 白色人种会交谈! 工厂造人 黄色人种会哭! 黄色人种会笑! 黄色人种会交谈! 工厂造人 黄色人种会哭! 黄色人种会笑! 黄色人种会交谈! 工厂造人 黑色人种会哭! 黑色人种会笑! 黑色人种会交谈! 工厂造人 黄色人种会哭! 黄色人种会笑! 黄色人种会交谈! 工厂造人 黄色人种会哭! 黄色人种会笑! 黄色人种会交谈!
发表评论
-
设计模式----中介者模式(demiator pattern)
2013-07-21 22:55 932AbstractMediator.java代码如下: pa ... -
设计模式----原型模式(prototype pattern)
2013-07-21 22:51 638AdvTemplate.java代码如下: package ... -
设计模式----状态模式(state pattern)
2013-07-21 22:48 1204LiftState.java代码如下: package ... -
设计模式----访问者模式(visitor pattern)
2013-07-21 22:44 973IVisitor.java代码如下: package co ... -
设计模式----观察者模式(observer)
2013-07-20 19:53 1071这里采用两种方式实现观察者模式:第一种方式为完全自己写, ... -
设计模式----组合模式(composite)
2013-07-20 16:13 930该设计模式是以公司的组织结构为背景的 Crop.java代码 ... -
设计模式----迭代器模式(Iterator)
2013-07-20 15:59 918IProject.java代码如下: package co ... -
设计模式----装饰者模式(decorator pattern)
2013-07-15 09:08 1027SchoolReport.java代码如下: packag ... -
设计模式----命令模式(command pattern)
2013-07-15 09:09 957Group.java代码如下: pa ... -
设计模式----桥梁模式(bridge pattern)
2013-07-14 22:21 1182Product.java代码如下: package com ... -
设计模式----模板方法模式(template method pattern)
2013-07-14 17:00 1147HummerModel.java代码如下: packag ... -
设计模式----适配器模式(adapter)
2013-07-14 13:37 865IUserInfo.java代码如下: package c ... -
设计模式----门面模式(facade)
2013-07-14 13:30 946LetterProcess.java代码如下 ... -
设计模式----抽象工厂模式(abstract factory pattern)
2013-07-13 23:09 913Human.java代码如下: package com. ... -
设计模式----多例模式(Multition)
2013-07-02 22:47 1033Emperor.java 代码如下: ... -
设计模式----单例模式(singleton)
2013-06-30 22:17 757单例就是唯一的意思。 第一种单例实现方式(在多线程环境中存在 ... -
设计模式----代理模式(proxy)
2013-06-30 22:02 960代理模式主要使用了java ... -
设计模式----策略模式(strategy)
2013-06-29 22:17 1088本文参考别人设计模式的一个例子。 关于诸葛亮的三个锦囊妙计的 ... -
装饰着模式(decorator)
2012-09-09 21:51 1008一下代码就是运用了装饰者模式: package com.ba ... -
观察者模式(observer)
2012-09-09 19:36 943设计模式中观察者模式的实现有很多方式,这里列出两种实现方式 1 ...
相关推荐
今天我们要探讨的是设计模式中的一个经典成员——工厂方法模式(Factory Method Pattern)。工厂方法模式是创建型设计模式的一种,它提供了一种创建对象的最佳方式。 ### 一、什么是工厂方法模式? 工厂方法模式...
本资料来源于吕震宇博客...C#设计模式(5)-Factory Method Pattern C#设计模式(4)-Simple Factory Pattern C#设计模式(3) - 设计原则(2) C#设计模式(2) - 设计原则(1) C#设计模式(1) - 面向对象基本概念复习
Factory Method Pattern 工厂三兄弟之工厂方法模式(一) 工厂三兄弟之工厂方法模式(二) 工厂三兄弟之工厂方法模式(三) 工厂三兄弟之工厂方法模式(四) 抽象工厂模式-Abstract Factory Pattern 工厂三兄弟之...
例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...
学习Java中的工厂方法模式,探索示例、用途、好处以及它如何增强代码的灵活性和可维护性。 **二、别名** * Virtual Constructor **三、Factory Method设计模式的意图** 使用工厂方法模式定义一个用于创建对象的...
工厂方法模式是面向对象设计模式中的一个核心模式,属于创建型模式。它的主要目的是通过引入一个工厂接口,将具体的对象创建过程封装起来,使得客户端在使用时无须关心产品类的确切实现,只需要通过工厂来获取所需的...
在"factory2-Pattern"这个压缩包文件中,可能包含了相关的代码示例、讲解文档或者教学材料,帮助读者更好地理解和应用工厂方法模式。如果能访问这些资源,将有助于深入学习和实践该模式。 总的来说,工厂方法设计...
在众多设计模式中,“工厂方法模式”(Factory Method Pattern)尤为突出,它是一种创建型设计模式,用于解决在类的实例化过程中,如何避免硬编码的问题,同时保持系统的灵活性与可扩展性。 #### 工厂方法模式的...
2. **工厂方法模式**(Factory Method Pattern):定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。 3. **抽象工厂模式**(Abstract Factory Pattern):提供一个创建一系列...
在提供的压缩包文件“design-pattern-factory-method-master”中,我们可以期待找到一个Java项目,其中包含了上述各个角色的实现,通过代码示例来详细展示工厂方法模式的用法。这将帮助开发者更好地理解如何在实际...
通过这个压缩包中的`factorymethodpattern`文件,你可以更深入地了解如何在实际的Java代码中实现和应用工厂方法模式,包括具体的类定义、方法调用和运行逻辑。通过阅读和学习这段代码,你可以掌握如何在自己的项目中...
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪一个具体类。这样,客户端代码就不需要知道具体的类是什么,只需通过工厂接口获取对象。 工厂...
- 工厂方法(Factory Method):提供一个接口来创建一个家族相关的对象,而无需指定其具体类。 - 抽象工厂(Abstract Factory):提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。 -...
包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)...Strategy)、模板方法模式(Template Method)和访问者模式(Visitor)...
在实际应用中,工厂方法模式有以下优点: - **封装变化**:当需要添加新产品或更换产品实现时,只需要增加新的具体产品类和对应的具体工厂类,无须修改原有代码,符合开闭原则。 - **多态性**:通过工厂方法,客户端...
- 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。 - 抽象工厂模式(Abstract Factory):提供一个接口,用于创建相关或依赖对象的家族,而无需指定具体类。 - 建造者...
3. **工厂方法模式(Factory Method Pattern)**: 工厂方法模式推迟了产品的实例化到子类中,允许在不修改工厂角色的情况下引入新产品。它包括工厂父类、工厂子类、抽象产品对象和具体产品对象。这种模式符合开闭...
4. 工厂模式(FACTORYMETHODPATTERN 和 ABSTRACTFACTORYPATTERN):工厂模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。 5. 门面模式(FACADEPATTERN)...
2. **工厂方法模式**(Factory Method Pattern):相比简单工厂模式,工厂方法模式将对象的创建委托给子类,使得核心工厂类更加抽象,不涉及具体产品的创建。这提高了系统的扩展性。例如: ```java public abstract...