美文网首页
(5)工厂方法模式

(5)工厂方法模式

作者: minminaya | 来源:发表于2017-07-25 21:22 被阅读5次

定义

定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法模式是创建型设计模式


一个普通的例子

  • 工厂和产品的关系

UML图

工厂方法模式

源代码

  • 普通模式
    1. 普通的类与抽象类调用
  • 常用模式
    范型和反射构造的,类似这样
public <T extends AudiCar> T createAudiCar(Class<T> clz) {
        AudiCar car = null;
        try {
            //用反射构造具体的AudiCar对象
            car = (AudiCar) Class.forName(clz.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) car;
    }

例子

一、普通模式

普通的抽象类和类调用的方式

  1. 抽象产品类
/** 抽象产品类
 * Created by Niwa on 2017/7/22.
 */
public abstract class Product {
    /**
     *  产品类的抽象方法
     *  由具体的产品类去实现
     *
     * */
    public abstract void method();
}
  1. 具体产品类A
/** 具体产品类A
 * Created by Niwa on 2017/7/22.
 */
public class ConcreteProductA extends Product{
    public ConcreteProductA() {
    }

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

  1. 具体产品类B
/** 具体产品类B
 * Created by Niwa on 2017/7/22.
 */
public class ConcreteProductB extends Product{
    public ConcreteProductB() {
    }

    @Override
    public void method() {
        System.out.println("我是具体的产品类A");
    }
}
  1. 抽象工厂类
/**
 * 抽象工厂类
 * Created by Niwa on 2017/7/22.
 */
public abstract class Factory {
    /**
     * 抽象工厂方法
     * 具体生成什么由子类去实现
     *
     * @return 具体的产品类
     */
    public abstract Product createProduct();
}

  1. 具体的工厂类,关键在这里头,生成什么产品的方法
/** 具体的工厂类
 * Created by Niwa on 2017/7/22.
 */
public class ConcreteFactory extends Factory {

    @Override
    public Product createProduct() {
        return new ConcreteProductA();
//        return new ConcreteProductB();
    }
}
  1. 测试
 public static void main(String[] args){
        Factory factory = new ConcreteFactory();
        ConcreteProductA concreteProductA = (ConcreteProductA) factory.createProduct();
        concreteProductA.method();
    }


结果:

我是具体的产品类A

二、反射构造模式

奥迪Q5,Q7和工厂的故事

  1. 奥迪汽车抽象产品类
/** 奥迪汽车抽象产品类
 * Created by Niwa on 2017/7/25.
 */
public abstract class AudiCar {
    /**
     *  车开走方法
     *
     * */
    public abstract void drive();

    /**
     *  车自动导航
     *
     * */
    public abstract void selfNavigation();

}

  1. Q5和Q7

/**
 * 奥迪汽车具体产品类Q5
 * Created by Niwa on 2017/7/25.
 */
public class AudiQ5 extends AudiCar {
    @Override
    public void drive() {
        System.out.println("Q5启动");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q5开始自动导航");
    }
}
/**
 * 奥迪汽车具体产品类Q7
 * Created by Niwa on 2017/7/25.
 */
public class AudiQ7 extends AudiCar {
    @Override
    public void drive() {
        System.out.println("Q7启动");
    }

    @Override
    public void selfNavigation() {
        System.out.println("Q7开始自动导航");
    }
}

  1. 奥迪的抽象工厂类
/**
 * 奥迪的抽象工厂类
 * Created by Niwa on 2017/7/25.
 */
public abstract class AudiFactory {
    /**
     * 这里的范型<T>指定很关键
     * 某车型的工厂方法,创建某车型对象
     *
     * @param clz 具体的suv 型号类型
     * @return 具体型号的suv车对象
     */
    public abstract <T extends AudiCar> T createAudiCar(Class<T> clz);
}
  1. 具体的奥迪汽车工厂,关键在这里,反射构造具体的AudiCar对象

/**
 * 具体的奥迪汽车工厂
 * Created by Niwa on 2017/7/25.
 */
public class AudiCarFactory extends AudiFactory {
    @Override
    public <T extends AudiCar> T createAudiCar(Class<T> clz) {
        AudiCar car = null;
        try {
            //用反射构造具体的AudiCar对象
            car = (AudiCar) Class.forName(clz.getName()).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T) car;
    }
}
  1. 测试,

public static void main(String[] a){
        //构造一个制造汽车的工厂对象
        AudiCarFactory audiCarFactory = new AudiCarFactory();

        //生产Q5
        AudiQ5 audiQ5 = audiCarFactory.createAudiCar(AudiQ5.class);
        audiQ5.drive();
        audiQ5.selfNavigation();

        //生产Q7
        AudiQ7 audiQ7 = audiCarFactory.createAudiCar(AudiQ7.class);
        audiQ7.drive();
        audiQ7.selfNavigation();

    }


结果:

Q5启动
Q5开始自动导航
Q7启动
Q7开始自动导航

源代码:DesignPattern



参考

《Android源码设计模式解析与实战读书》
各大佬博客


end

相关文章

  • 23种设计模式分类

    创建型模式(5种): 工厂方法模式(Factory Method Pattern)抽象工厂模式(Abstract ...

  • 二十三种设计模式

    参考地址 一、创建型 1、单例模式 2、简单工厂 3、抽象工厂 4、工厂方法模式 5、模版方法模式 知道名字的模式...

  • 创建型模式1-工厂方法

    创建型模式1-工厂方法 创建型模式简 创建型模式主要有5个: 工厂方法(factory method) 抽象工厂(...

  • 设计模式-3种工厂模式

    工厂模式包括:简单工厂模式,工厂方法模式,抽象工厂模式 简单工厂模式 工厂方法根据参数直接创建实例:工厂->产品 ...

  • 设计模式-工厂模式

    工厂模式概念 实例化对象,用工厂方法代替new操作。工厂模式包括工厂方法模式和抽象工厂模式。抽象工厂模式是工厂模式...

  • 《大话设计模式》-GoF的24种设计模式

    工厂方法模式 1. 单例模式 2. 简单工厂模式 3. 工厂模式 4. 建造者模式 5. 原型模式 6. 解释器模...

  • 设计模式-工厂方法模式

    1、工厂方法模式(Factory Method) 工厂方法模式分为三种: 普通工厂模式 多个工厂模式 静态工厂模式...

  • 设计模式 工厂模式

    工厂模式 工厂模式三大类1、简单工厂模式(静态工厂方法模式)2、工厂方法模式3、抽象工厂模式(Kit模式) 简单工...

  • 设计模式-工厂模式-原理剖析

    内容一:设计模式? 创建型模式->5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 结构型模式->...

  • 38种Javascript设计模式

    38种设计模式 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 4.建造者模式 5.原型模式 6.单例模式 ...

网友评论

      本文标题:(5)工厂方法模式

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