工厂模式
Posted 木极子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式相关的知识,希望对你有一定的参考价值。
一、什么是工厂模式
很任性的就不想解释了,实在是太多了,给个最简单的链接: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");
好了,程序到这就结束了。
总结一下:什么是工厂模式?就是用工厂来生产对象,如果是工厂直接生产对象那就是简单工厂模式,如果工厂生产的是工厂对象,那么就是抽象工厂模式,但是它们都是工厂模式,这就是工厂模式。
以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章
JAVA设计模式——工厂模式简单工厂模式工厂方法模式抽象工厂模式