简单工厂模式--介绍、应用及代码
来源:互联网 发布:世界银行数据库怎么用 编辑:程序博客网 时间:2024/05/04 13:31
----引言----
话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰)、Bmw(宝马)、Audi(奥迪)看来这人比较爱国,没有日本车),还雇了司机为他开车。不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上Audi后他说"开奥迪车!"。你一定说:这人有病!直接说开车不就行了?! 而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是,这种有病的现象在OO语言中可以避免了。下面以Java语言为基础来引入我们本文的主题:工厂模式!!
一、工厂模式简介
工厂模式主要是为创建对象提供了接口。工厂模式按照《Java与模式》中的提法分为三类:
1. 简单工厂模式(Simple Factory)
2. 工厂方法模式(Factory Method)
3. 抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。
工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
二、什么时候使用工厂模式
下面是使用工厂模式的两种情况:
1.在编码时不能预见需要创建哪种类的实例。
2.系统不应依赖于产品类实例如何被创建、组合和表达的细节
三、什么是简单工厂模式
顾名思义,这个模式本身很简单,而且使用在业务较简单的情况下。
1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现
那么简单工厂模式怎么用呢?我来举个例子吧,我想这个比讲一大段理论上的文字描述要容易理解的多!下面就来给那个暴发户治病: P
在使用了简单工厂模式后,现在暴发户只需要坐在车里对司机说句:"开车"就可以了。来看看怎么实现的:
//抽象产品角色public interface Car{ public void drive(); } //具体产品角色public class Benz implements Car{ public void drive() { System.out.println("Driving Benz "); } }public class Bmw implements Car{ public void drive() { System.out.println("Driving Bmw "); } } //工厂类角色public class Driver{//工厂方法//注意 返回类型为抽象产品角色public static Car driverCar(String s)throws Exception {//判断逻辑,返回具体的产品角色给Client if(s.equalsIgnoreCase("Benz")) return new Benz(); else if(s.equalsIgnoreCase("Bmw")) return new Bmw();} //欢迎暴发户出场...... public class Magnate{ public static void main(String[] args){ //告诉司机我今天坐奔驰Car car = Driver.driverCar("benz"); //下命令:开车car.drive(); }}
四、传统简单工厂模式及其扩展
1、传统简单工厂模式
interface fruit{ public abstract void eat();} class Apple implements fruit{ public void eat(){ System.out.println("Apple"); }} class Orange implements fruit{ public void eat(){ System.out.println("Orange"); }} // 构造工厂类// 也就是说以后如果我们在添加其他的实例的时候只需要修改工厂类就行了class Factory{ public static fruit getInstance(String fruitName){ fruit f=null; if("Apple".equals(fruitName)){ f=new Apple(); } if("Orange".equals(fruitName)){ f=new Orange(); } return f; }}class hello{ public static void main(String[] a){ fruit f=Factory.getInstance("Orange"); f.eat(); } }
在添加一个子类的时候,就需要修改工厂类了。如果我们添加太多的子类的时候,改的就会很多。
2、使用反射机制的工厂模式
package Reflect; interface fruit{ public abstract void eat();} class Apple implements fruit{ public void eat(){ System.out.println("Apple"); }} class Orange implements fruit{ public void eat(){ System.out.println("Orange"); }} class Factory{ public static fruit getInstance(String ClassName){ fruit f=null; try{ f=(fruit)Class.forName(ClassName).newInstance(); }catch (Exception e) { e.printStackTrace(); } return f; }}class hello{ public static void main(String[] a){ fruit f=Factory.getInstance("Reflect.Apple"); if(f!=null){ f.eat(); } }}
现在就算我们添加任意多个子类的时候,工厂类就不需要修改。
个人理解真正的创新是从无到有;而软件行业存在的“创新”一般都是从粗到细,从糙到精,是一个完善的过程,属于创造性模仿。两者都必须存在,技术才能越来越进步。
传统的工厂模式,它是根本,因为它提出了一种思想;利用反射机制,或者还有结合属性文件的工厂模式都是在这种思想的前提下。很明显,后者的效率要高于前者,值得肯定的同时,我们更要鼓励自己进行创造性思考。站在巨人的肩膀上看得更远,可我更期待我们国人能有更多的巨人诞生!!!
参考文章:http://www.cnblogs.com/poissonnotes/archive/2010/12/01/1893871.html
http://blog.csdn.net/lulin27861/article/details/19070031
- 简单工厂模式--介绍、应用及代码
- java 工厂模式简单介绍及例子
- 工厂模式简单介绍及应用(以数据导入功能实现为例)
- 单例模式--介绍、应用及代码
- 代理模式--介绍、应用及代码
- 适配器模式--介绍、应用及代码
- 建造者模式--介绍、应用及代码
- 模板方法模式--介绍、应用及代码
- 迭代器模式--介绍、应用及代码
- 策略模式--介绍、应用及代码
- 装饰器模式--介绍、应用及代码
- JAVA接口的应用及工厂模式的简单示例
- 简单工厂模式及工厂模式
- 简单介绍之工厂模式
- 简单的工厂模式代码
- 简单工厂模式及实例
- 简单工厂模式及实例
- 简单工厂模式及实例
- 1、选框工具的使用(以椭圆工具为例)
- 解决NDK出现error: exception handling disabled, use -fexceptions to enable的问题
- 移除Eclipse中无用的import,导入需要的包快捷键 shift+ctrl+o,移除一样
- TCP/IP三次握手和HTTP过程
- 子串
- 简单工厂模式--介绍、应用及代码
- Android之Service
- SDUTOJ 选夫婿1
- memset函数说明
- 寒假训练--KMP--Power Strings
- 窗口打开时div内容自适应窗口高度和宽度
- Python实现FTP传输
- 目标跟踪学习系列三:A robust boosting tracker with minimum error bound in a Co-training framework
- SDUTOJ 选夫婿2