美文网首页
工厂方法模式

工厂方法模式

作者: 枫狂的孩子 | 来源:发表于2019-05-29 17:40 被阅读0次

    1.工厂方法模式介绍

    工厂方法模式是一种结构简单的模式,其在我们平时开发中应用很广泛,也许你并不知道,但是你已经使用了无数次该模式了,如activity里的各个生命周期方法,以onCreate为例,他就可以看作是一个工厂方法,我们在其中可以构造我们的view,并通过setContentView()返回给framework处理等。

    2.工厂方法模式的定义

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

    3.工厂方法模式的使用场景

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

    4.工厂模式的简单用例

    public abstract class Product {
    
        /**
         * 产品类的抽象方法
         * 有具体的产品类去实现
         */
        public abstract void method();
    }
    
    public class ConcreateProductA extends Product {
        @Override
        public void method() {
            System.out.print("我是具体产品A");
        }
    }
    
    public class ConcreateProductB extends Product {
        @Override
        public void method() {
            System.out.print("我是具体产品B");
        }
    }
    
    
    public abstract class Factory {
        /**
         * 抽象工厂类
         * 具体产生什么由子类去实现
         * @return
         */
        public abstract Product createProduct();
    }
    
    public class ConcreteFactory extends Factory {
        @Override
        public Product createProduct() {
            return new ConcreateProductA();
        }
    }
    
    public class Client {
        public static void main(String[] agrs) {
            Factory factory = new ConcreteFactory();
            Product product = factory.createProduct();
            product.method();
        }
    }
    

    四大模块:

    抽象工厂:工厂方法模式的核心;

    具体工厂:实现具体的业务逻辑;

    抽象产品:工厂方法模式创建的产品的父类;

    具体产品:实现抽象产品的某个具体产品的对象;

    这种方法比较常见,需要哪一个产品就生产那个,有时候也可以利用反射方式更简洁的来生成具体产品对象,此时,需要在工厂方法的参数列表中传入一个class类来决定是哪一个产品类。

    public abstract class Factory1 {
        /**
         * 抽象工厂类
         * 具体产生什么由子类去实现
         *
         * @return
         */
        public abstract <V extends Product> V createProduct(Class<V> clz);
    }
    
    public class ConcreteFactory1 extends Factory1 {
        @Override
        public <T extends Product> T createProduct(Class<T> clz) {
            Product p = null;
            try {
                p = (Product) Class.forName(clz.getName()).newInstance();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            return (T) p;
        }
    }
    

    再来看看具体的Client中的实现

    public class Client {
        public static void main(String[] agrs) {
            Factory factory = new ConcreteFactory();
            Product product = factory.createProduct();
            product.method();
    
            Factory1 factory1 = new ConcreteFactory1();
            Product product1 = factory1.createProduct(ConcreateProductA.class);
            product1.method();
        }
    }
    

    需要哪一个类的对象就传入哪一个类的对象,这种方法比较简洁,动态,如果你不喜欢这种方式,以恶可以尝试每一个产品定义一个具体的工厂,各司其职。

    像这样拥有多个工厂的方式我们称为工厂方法模式。它降低了对象之间的耦合度,而且,工厂方法模式依赖于抽象的架构,其将实例化的任务交由子类去完成,有非常好的扩展性。

    相关文章

      网友评论

          本文标题:工厂方法模式

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