Fork me on GitHub

复杂对象的创建-工厂方法模式

在Android开发中,最常见的工厂模式应该就是Bitmap的创建了,因为Bitmap的创建是分很多种方式的,我们可以使用本地文件来创建Bitmap对象,也可以使用网络上的资源来创建Bitmap对象,具体方法如下:

1
2
3
BitmapFactory.decodeResource(this.getResources(),R.drawable.haha); //使用本地文件
HttpURLConnection con = (HttpURLConnection) conurl.openConnection();
BitmapFactory.decodeStream(con.getInputStream()); //使用网络资源

下面来模拟一下Bitmap对象的创建过程

  1. 创建抽象产品类
1
2
3
4
5
public abstract class BitmapProduct {
//定义属性及方法
public void method(){
}
}
  1. 创建具体产品类
1
2
3
4
5
6
public class srcBiamapProduct extends BitmapProduct {
@Override
public void method() {
System.out.print("srcBitmap");
}
}

本地文件生成的Bitmap对象

1
2
3
4
5
6
public class networkBitmapProduct extends BitmapProduct {
@Override
public void method() {
System.out.print("networkBitmapProduct");
}
}

网络资源生成的Bitmap对象

  1. 创建抽象工厂类
1
2
3
public abstract class BitmapFactory {
public abstract BitmapProduct createBitmap();
}
  1. 创建具体工厂类
1
2
3
4
5
6
public class concreteFactory extends BitmapFactory {
@Override
public BitmapProduct createBitmap() {
return new srcBiamapProduct();
}
}
使用如下:
1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
BitmapFactory bitmapFactory = new concreteFactory();
bitmapFactory.createBitmap();
}
}
这里的Bitmap创建和我们在Android开发时所使用的工厂模式还是有区别的,因为在Android中Bitmap创建采用的时静态工厂模式,像这样
1
2
3
4
5
public  class BitmapFactory {
public static srcBiamapProduct createBitmap() {
return new srcBiamapProduct();
}
}

除了上述的一般方法之外,我们也可以使用反射来进行创建,不过鉴于反射会对性能产生影响,要慎用

  1. 抽象工厂类
1
2
3
public abstract class BitmapFactory {
public abstract <T extends BitmapProduct> T createBitmap(Class<T> tClass);
}
  1. 具体工厂类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class concreteFactory extends BitmapFactory {
    @Override
    public <T extends BitmapProduct> T createBitmap(Class<T> tClass) {
    BitmapProduct bitmapProduct = null;
    try {
    bitmapProduct = (BitmapProduct) Class.forName(tClass.getName()).newInstance();
    }catch (Exception e) {
    e.printStackTrace();
    }
    return (T) bitmapProduct;
    }
    }
使用
1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
BitmapFactory bitmapFactory = new concreteFactory();
bitmapFactory.createBitmap(srcBiamapProduct.class);
}
}