设计模式之工厂模式

作者: Allen_tong | 来源:发表于2017-03-29 11:47 被阅读61次

    上周五职级评审,被公司的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进行了绑定,开始不断的读取消息队列中的消息并发送消息。

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

    相关文章

      网友评论

        本文标题:设计模式之工厂模式

        本文链接:https://www.haomeiwen.com/subject/efcjottx.html