上周五职级评审,被公司的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 extends Product> T createProduct(Class<T> tClass);
}
具体工厂
public class ConcreteFactory extends Factory {
@Override
public <T extends Product> T createProduct(Class<T> 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进行了绑定,开始不断的读取消息队列中的消息并发送消息。
总体来说,工厂模式是一种比较好的设计模式,但是在我们新加一个新品类的时候需要编写一个新的产品类,并引入抽象类,导致类结构的复杂化。所以根据实际的业务场景,需要自己权衡。