工厂模式

一、什么是工厂模式

很任性的就不想解释了,实在是太多了,给个最简单的链接: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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值