工厂模式
来源:互联网 发布:单片机模拟仿真软件 编辑:程序博客网 时间:2024/06/10 11:57
一、什么是工厂模式
很任性的就不想解释了,实在是太多了,给个最简单的链接:http://baike.baidu.com/link?url=AXJgxxD8Qu5DaImDQvBTv34vo6IN7UOoTqFXrQ78S_oMckGzmpLff2jKsp7S8PG_-S4hLAz-8tOh16GafARMtspJqjKul6hfrI-8oD6J_9Pj8vJy7PTq4WoKhj-i-Dm9
整理下:工厂模式一般情况下分为以下几种:简单工厂模式还有就是抽象工厂模式。(注意:不管是简单工厂模式还是抽象工厂模式都是工厂模式,那么深究没有意义,至于区别后面解释,或许都不用解释)
案例:你(Person)需要打印机,打印机呢,有激光式(LaserPrinter)、喷墨式(JetPrinter)等,你可能需要喷模式的,也可能是激光式的。
那么在程序中如何描述呢,一般情况下,会在Person的对象中创建一个打印机对象,如:new LaserPrinter();或者new JetPrinter();可是这样有一个缺点,如果除了Person还有其它的对象调用呢,而且这样的对象有100个1000个,不修改倒也没什么问题,可是如果突然有一天要修改了,那么面临的就是更改100个1000个的对象,这不是一件有趣的事。
因此就有了这一种工厂模式。
二、简单工厂模式
简单工厂模式理解起来比较简单,用程序说话吧
创建一个打印机接口(Printer):
package com.design.factory;public interface Printer { public void print(String str);}
创建一个喷墨式打印机(LaserPrinter):
package com.design.factory;public class LaserPrinter implements Printer{ @Override public void print(String str) { System.out.println("laser:"+str); }}
创建一个激光式打印机(JetPrinter):
package com.design.factory;public class JetPrinter implements Printer{ @Override public void print(String str) { System.out.println("jet:"+str); }}
创建一个打印机工厂(PrintFactory ):
package com.design.factory;public class PrintFactory { public static Printer getPrint(){ return new JetPrinter();//返回一个激光答应及,如果需要喷墨式只要换成 return new LaserPrinter();就可 }}
创建一个使用对象(Person):
package com.design.factory;public class Person { public void userPring(String str){ Printer p = PrintFactory.getPrint(); p.print(str); } public static void main(String[] args) { Person person = new Person(); person.userPring("hello zxm"); }}
上面的Person比较简单,利用多态用PrinterFactory获取了一个Printer对象,如果要更换这个Printer对象的类型,只需要更改这个工厂中获取这个Printer方法的返回值就可以了。
三、抽象工厂模式
抽象工厂模式事什么意思:把工厂进行抽象化。
我们想象以下,如果把工厂进行抽象化,如创建一个interface的工厂接口,那么就需要创建各种打印机的工厂类,来获取各种打印机对象,举个例子,有个打印机工厂(PrinterFactory)接口,有个激光打印机工厂(JetPrinterFactory)实现了打印机工厂(PrinterFactory)接口,并且这个打印机工厂(类)可以获取打印机,如getPrint()方法,返回一个打印机实例。
再想一下,如果一个用户(Person)怎么获取这个工厂呢,可以这么写:
PrinterFactory pf = new JetPrinterFactory();Printer p = pf.getPrinter();
可是这样也形成了一种耦合,不再和打印机而是和打印机工厂的耦合。
至于怎么解决,还是用程序来理解吧
创建一个打印机接口(Printer):
package com.design.objectfactory;public interface Printer { public void print(String str);}
创建一个喷墨式打印机(LaserPrinter):
package com.design.objectfactory;public class LaserPrinter implements Printer{ @Override public void print(String str) { System.out.println("laser:"+str); }}
创建一个激光式打印机(JetPrinter ):
package com.design.objectfactory;public class JetPrinter implements Printer{ @Override public void print(String str) { System.out.println("jet:"+str); }}
创建一个工厂接口(PrinterFactory):
package com.design.objectfactory;public interface PrinterFactory { public Printer getPrinter();}
创建一个喷墨式打印机工厂(PrinterFactory):
package com.design.objectfactory;public class LaserPrinterFactory implements PrinterFactory{ @Override public Printer getPrinter() { return new LaserPrinter(); }}
创建一个激光式打印机工厂(JetPrinterFactory):
package com.design.objectfactory;public class JetPrinterFactory implements PrinterFactory { @Override public Printer getPrinter() { return new JetPrinter(); }}
创建一个获取工厂的对象(PrinterFacroryFactory):
package com.design.objectfactory;public class PrinterFacroryFactory { public PrinterFactory getPrinterFactory(String type){ if(type.equalsIgnoreCase("jet")){ return new JetPrinterFactory(); }else{ return new LaserPrinterFactory(); } }}
好了,最后一步,创建一个用户(Person):
package com.design.objectfactory;public class Person { public void userPring(String str){ //下面这句很重要,仔细想想 PrinterFactory pf = new PrinterFacroryFactory().getPrinterFactory("jet"); Printer p = pf.getPrinter(); p.print(str); } public static void main(String[] args) { Person person = new Person(); person.userPring("hello zxm"); }}
好了,程序到这就结束了。
总结一下:什么是工厂模式?就是用工厂来生产对象,如果是工厂直接生产对象那就是简单工厂模式,如果工厂生产的是工厂对象,那么就是抽象工厂模式,但是它们都是工厂模式,这就是工厂模式。
- 工厂模式 -- 工厂方法
- 工厂模式 -- 抽象工厂
- 工厂模式-简单工厂
- 工厂模式-工厂方法
- 工厂模式:静态工厂
- 工厂模式-简单工厂
- 工厂模式-抽象工厂
- 工厂模式-工厂方法
- 工厂 > 工厂方法模式
- 工厂模式-静态工厂
- 工厂模式-抽象工厂
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 工厂模式
- 【J2EE】JSP简介
- 我眼中的subprocess
- 回溯法之经典问题->皇后问题
- jquery对象和dom对象的关系
- 软件测试(二)
- 工厂模式
- 【CodeVS】【2004年NOIP全国联赛提高组】1057 津津的储蓄计划
- 多线程的聊天室实现-服务器端
- 简单工厂模式、工厂模式和抽象工厂模式例子
- python的安装
- PPP协议遇到的问题
- qut1353yeweiyang的打印服务(二分)
- spring学习总结(八):IOC & DI 配置Bean之注解配置
- 如何在Phpstorm中设置FTP,并快速进行文件比较,上传下载,同步等操作