工厂模式

来源:互联网 发布:单片机模拟仿真软件 编辑:程序博客网 时间: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");    }}

好了,程序到这就结束了。
总结一下:什么是工厂模式?就是用工厂来生产对象,如果是工厂直接生产对象那就是简单工厂模式,如果工厂生产的是工厂对象,那么就是抽象工厂模式,但是它们都是工厂模式,这就是工厂模式。

0 0
原创粉丝点击