工厂模式Factory

来源:互联网 发布:网络上刘皇叔是什么梗 编辑:程序博客网 时间:2024/04/30 01:56

模式介绍

  • 定义 : 定义一个用于创建的对象的接口, 让子类决定实例化哪个类
  • 场景 : 在任何需要生成复杂对象的地方, 都可以使用工厂方法模式. 复杂对象适合使用工厂模式, 用 new 就可以完成创建的对象无需使用工厂模式.

工厂方法模式完全符合设计模式原则, 降低了对象之间的耦合度, 而且, 工厂方法模式依赖于抽象的架构, 将实例化的任务交由了子类实现.

例子说明

比如你想要出门,每次出行你都要根据天气情况选择出行方式,如果下雨天,就开自己的私家车,如果晴天就出门坐公车。那么这里可以抽取出一个基类出来。

//车的基类public abstract class Car {    abstract void driveCar();}//车的实现类public class Bus extends Car {    @Override    void driveCar() {        //..    }}public class PrivateCar extends Car {    @Override    void driveCar() {        //...    }}//这里就有两种方式的选择,但是具体怎么选择要根据情况,如果你在当前类中去选择判断,那么毫无疑问,代码会显得有点冗余,这时候我们就可以创建一个工厂类来根据我们具体的情况返回我们想要的类。public class DriveFactory {    private int type;    public static Car driveWhichCar(int type){        switch (type)        {            case 0: return new Bus();            case 1: return new PrivateCar();        }        return null;    }}//使用时,则是public class Person {    public static void main(String args[]){        Car car = DriveFactory.driveWhichCar(0);        car.driveCar();    }}

可以看到对于调用者来说,只关系你调用获取的是什么,而不关什么实现。而对于维护扩展来说也是非常方便,在工厂方法里添加一个实现类就行。当然这里的抽象可以是接口,也可以使抽象类。

源码参考

看到工厂大家也就想到了一个类,那就是BitmapFactory,没错,这也是一个工厂模式

public class BitmapFactory {    private static final int DECODE_BUFFER_SIZE = 16 * 1024;    public static Bitmap decodeByteArray(...)    public static Bitmap decodeStream(...)    public static Bitmap decodeFileDescriptor(...)    //....}//就不列出来了

而Bitmap最终的获取实现,则是通过这里底层的native方法

private static native Bitmap nativeDecodeStream(InputStream is, byte[] storage,            Rect padding, Options opts);private static native Bitmap nativeDecodeFileDescriptor(FileDescriptor fd,            Rect padding, Options opts);private static native Bitmap nativeDecodeAsset(long nativeAsset, Rect padding, Options opts);private static native Bitmap nativeDecodeByteArray(byte[] data, int offset,            int length, Options opts);private static native boolean nativeIsSeekable(FileDescriptor fd);

BitmapFactory与前面举的DriveFactory例子,有点不同,当思想都是一样的,BitmapFactory是根据调用方法返回对应的Bitmap,返回Bitmap区别在于实现方法不同。而DriveFactort则是根据多态,根据不同的类型,返回不同的子类。所以,使用时候不要太刻意是否要抽象出基类。思想是活的。

0 0
原创粉丝点击