工厂方法模式

一.背景

Android其实很多用到该模式的,以onCreate为例,它就可以看作是一个工厂方法,我们在其中可以构造我们的View并通过setContentView返回给frameWork处理

二.具体定义

其实就是一个用于创建对象的接口,让子类决定实例化哪个类

三.工厂方法模式的使用


public abstract class Product {
    /**
     * 产品类的抽象方法
     * 由具体的产品类去实现
     */
    public abstract void method();
}


public class ConcreteProductA extends Product {

    @Override
    public void method() {
        System.out.println("我是具体产品A");
    }
}


public class ConcreteProductB extends Product {

    @Override
    public void method() {
        System.out.println("我是具体产品B");
    }
}



public abstract class Factory {
    /**
     * 抽象工厂方法
     * 具体生产什么由子类去实现
     */
    public abstract Product createProduct();
}



public class ConcreteFactory extends Factory {

    @Override
    public Product createProduct() {
        return new ConcreteProductA();
        //如果要生产B的话
        //return new ConcreteProductB();
    }
}


public class Client {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory();
        Product p = factory.createProduct();
        p.method();
    }
}

缺点:

可以看出缺点在于,每次要生产其他的产品,都要去改ConcreteFactory,这样就很不方便。

解决方案如下:


public abstract class Factory{
    /**
     * 抽象工厂方法
     * 具体生产什么由子类去实现
     * @param clz 产品对象类 类型
     * @return 具体的产品对象
     * */
    public abstract <T extends  Product> T createProduct(Class<T> clz);
}



public class ConcreteFactory extends Factory{
    @Override
    public <T extends  Product> T createProduct(Class<T> clz){
        Product p = null;
        try {
            p = Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T)p;
    }
}


public class Client {
    public static void main(String[] args) {
        Factory factory = new ConcreteFactory();
        Product p = factory.createProduct(ConcreteProductB.class);
        p.method();
    }
}



可以看出需要哪一个类的对象就传入哪一个类的类型即可,这种方法比较简洁,动态(学会!!!!!!,如果你不喜欢这种方式,也可以尝试为每一个产品都定义一个具体的工厂,各司其职。

 

(1)简单实现(用的就是上面的方法)

需求:生产奥迪Q3,Q5,Q7,这三个车内部构造差不多,但是自动驾驶的功能各有不同


public abstract class AudiCar{
    /**
     * 汽车的抽象产品类
     * 定义汽车的一个行为方法 车可以启动开走
     * */
    public abstract void drive();

    /**
     *汽车的抽象产品类
     * 定义汽车的一个行为方法 车可以自动巡航
     * */
    public abstract  void selfNavigation();
}


public class AudiQ3 extends AudiCar{

    @Override
    public void drive() {
        System.out.println("Q3  启动了");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q3  自动驾驶");
    }
}



public class AudiQ5 extends AudiCar{

    @Override
    public void drive() {
        System.out.println("Q5  启动了");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q5  自动驾驶");
    }
}



public class AudiQ7 extends AudiCar{

    @Override
    public void drive() {
        System.out.println("Q7  启动了");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q7  自动驾驶");
    }
}


public abstract  class AudiFactory {
    /**
     * 某车型的工厂方法
     * @param  clz具体的SUV型号类型
     * @return 具体型号的SUV车对象
     * */
    public abstract <T extends AudiCar> T createAudiCar(Class<T> clz);
}


public class AudiCarFactory extends AudiFactory{

    @Override
    public <T extends AudiCar> T createAudiCar(Class<T> clz) {
        AudiCar car = null;
        try {
            car = (AudiCar)Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return (T)car;
    }
}


public class Client{
    public static void main(String[] args){
        //构造一个制造汽车的工厂对象
        AudiFactory factory = new AudiCarFactory();

        //生产Q3并启动
        AudiQ3 audiQ3 = factory.createAudiCar(AudiQ3.class);
        audiQ3.drive();
        audiQ3.selfNavigation();
        //生产Q5并启动
        AudiQ5 audiQ5 = factory.createAudiCar(AudiQ5.class);
        audiQ5.drive();
        audiQ5.selfNavigation();
        //生产Q7并启动
        AudiQ7 audiQ7 = factory.createAudiCar(AudiQ7.class);
        audiQ7.drive();
        audiQ7.selfNavigation();
    }
}


四.Android源码中的工厂方法模式

(1)ArrayListHashSet中的Iterator其实就相当于一个工厂方法(相当于抓娃娃机器)

(2)

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new LinearLayout(this));
    }

}


每一个Activity都通过设置setContentView来设置不同的View

这其实就是一个工厂模式

 

<1>关于onCreate方法

 

对于一个应用程序来说,其真正的入口时在ActivityThread类中由我们熟悉的main方法

ActivityThread是一个final类,也就是说他不能被继承,一个应用程序对应一个ActivityThread,当Zygote进程孵化出一个新的应用进程后,会执行ActivityThreadmain方法,main方法中做了一些比较常规的逻辑,比如准备Looper和消息队列,然后调用ActivityTheadattach方法将其绑定ActivityManagerService中,开始不断地读取消息并分发消息

 

分析待添加!!!!。。。。

 


总结:

缺点:每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然会导致类结构的复杂化

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值