设计模式之工厂模式

上周五职级评审,被公司的T8问的晕头转向,深感差距之大,自己还是应该好好沉淀。by the way

设计模式很多,一百多种,可平时我们开发应用中却只有那几种,单例,建造,工厂,装饰。。。

工厂模式在我们平时的开发中应用也是非常广泛,比如我们这期项目当中就有具体用到,场景:我们在addView()时具体到View,会定义一个父类AbstractLayout,定义一些commmon method,子类具体的去实现。

先看下工厂模式(Factroy Pattern)的具体定义

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

使用场景

  • 在任何需要生成复杂对象的地方,都可以使用工厂模式,复杂对象适合使用工厂模式,用new可以完成创建对象的对象无需使用工厂模式
抽象产品
public abstract class Product {
    public abstract void method();
}
具体产品
public class ProductA extends Product {
    @Override
    public void method() {
    }
}
抽象工厂
public abstract class Factory {
    public abstract Product createProduct();
}
具体工厂
public class ConcreteFactory extends Factory {
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}

主要分了四个模块

  • 抽象工厂:工厂方法模式的核心
  • 具体工厂:自己具体实现业务逻辑
  • 抽象产品:工厂模式所创建产品的父类
  • 具体产品:抽象产品的某个具体产品的对象

具体的使用:

Factory factory = new ConcreteFactory();
Product product =  factory.createProduct();
product.method();

这里生产的是ProductA,如果要生成ProductB,则用ProductB 继承 Product 实现method方法 ,实现自己的业务逻辑,在ContreteFactory的createProduct()方法内返回则可
这种方法比较常见 需要那个就生成那个

当然可以使用反射来更简洁的生成具体的对象

抽象工厂
public abstract class Factory {
//    public abstract Product createProduct();
    public abstract  T createProduct(Class tClass);
}
具体工厂
public class ConcreteFactory extends Factory {
    @Override
    public  T createProduct(Class tClass) {
        Product product = null;
        try {
            product = (Product) Class.forName(tClass.getName()).newInstance();
        }catch (Exception e){
            e.printStackTrace();
        }
        return (T)product;
    }
}

具体使用

Factory factory = new ConcreteFactory();
Product product = factory.createProduct(ProductA.class);
product.method;

需要那个类的对象就传入那个,这种方式更简洁,动态,个人倾向于第二种。
这里使用到了范型方法,不太了解的可以看下
java中的范型方法

对应到我们android中,onCreate()方法就相当于一个工厂,不同的activity通过onCreate()方法设置contentVeiw返回给framework做处理,通过设置不同的view来展示不同的界面

关于onCreate()方法到底是怎么实现的有能力的可以亲自读源码

这里简单的说下,在java中我们总会在构造方法中去做一些初始化操作,可是对应在android中activity貌似没有这样做,framework已经替我们简化了这部分的逻辑,activity只需要根据相应的生命周期去处理具体的业务逻辑。

我们都知道,对于一个app来说真正的入口是ActivityThread这个类,里面有我们熟悉的main方法,这个类被定义为final,不能被继承,可以理解为一个程序对应一个ActivityThread,一个入口,main方法里面有一些常规的逻辑,比如准备Looper和消息队列,然后调用ActivityThread的attach()方法将它和AMS进行了绑定,开始不断的读取消息队列中的消息并发送消息。

总体来说,工厂模式是一种比较好的设计模式,但是在我们新加一个新品类的时候需要编写一个新的产品类,并引入抽象类,导致类结构的复杂化。所以根据实际的业务场景,需要自己权衡。

你可能感兴趣的:(设计模式之工厂模式)