《Android源码设计模式解析与实战》读书笔记(五)

第五章、工厂方法模式

1.定义

定义一个用于创建对象的接口,让子类决定实例化那个类。

2.使用场景

在任何需生成复杂对象的地方,都可以使用工厂方法模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。

3.模式的简单实现

抽象产品类:

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

具体产品类A:

public class ConcreteProductA extends Product {

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

具体产品类B:

public class ConcreteProductB extends Product {

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

抽象工厂类:

public abstract class Factory {
    /**
     * 抽象工厂方法
     * 具体由子类实现
     * 
     * @return 具体的产品对象
     * */
    public abstract Product createProduct();
}

具体工厂类:

public class ConcreteFactory extends Factory {
    /**
     * 具体工厂类
     * */
    @Override
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

调用:

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

结果:

我是产品A

如果想得到ConcreteProductB的实例,更改ConcreteFactory逻辑:

public class ConcreteFactory extends Factory {
    /**
     * 具体工厂类
     * */
    @Override
    public Product createProduct() {
        //return new ConcreteProductA();
        return new ConcreteProductB();
    }
}

上面这种方式可能不是很灵活,可以利用反射实现,如下:

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

具体工厂类修改:

public class ConcreteFactory extends Factory {
    /**
     * 具体工厂类
     * */
    @SuppressWarnings("unchecked")
    @Override
    public <T extends Product> T createProduct(Class<T> clz) {
        Product product = null;
        try {
            product = (Product) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T)product;
    }
}

Client实现:

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

如果我们的工厂只有一个,我们可以进行简化,这种方式又称为简单工厂模式或者静态工厂模式。如下:

public class Factory {
    /**
     * 抽象工厂方法
     * 具体由子类实现
     * 
     * @param clz 产品对象类类型
     * 
     * @return 具体的产品对象
     * */
    public static <T extends Product> T createProduct(Class<T> clz) {
        Product product = null;
        try {
            product = (Product) Class.forName(clz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T)product;
    }
}

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

1.Activity的各种生命周期

2.ArrayList和HashSet

5.总结

优点:

1.工厂方法模式完全符合设计原则,降低了对象之间的耦合。高层模块只需要知道产品的抽象类,其他的实现都不需要关心。
2.良好的封装性,代码结构清晰。扩展性好。

缺点:

每次我们为工厂方法模式添加新的产品时就要编写一个新的产品类。同时还要引入抽象层,这必然会导致类结构的复杂化,所以,在某些情况比较简单时,是否要使用工厂模式,需要设计者权衡利弊了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值