工厂方法模式

来源:互联网 发布:自然之名酵母水 知乎 编辑:程序博客网 时间:2024/06/10 15:31

一.背景

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中,开始不断地读取消息并分发消息

 

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

 


总结:

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

 


0 0
原创粉丝点击