工厂模式Factory

模式介绍

  • 定义 : 定义一个用于创建的对象的接口, 让子类决定实例化哪个类
  • 场景 : 在任何需要生成复杂对象的地方, 都可以使用工厂方法模式. 复杂对象适合使用工厂模式, 用 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值