设计模式之工厂方法模式

原创 2016年08月31日 14:40:27

概要

设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。

定义

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

使用场景

任何使用复杂对象的地方,都可以使用工厂模式

UML

这里写图片描述

1.抽象工厂

抽象工厂:我们都知道,工厂,一般只有一个作用,那就生产,比如,吉利汽车厂,那就制造吉利汽车,iphone手机制造厂就造iphone等等
所以可以用一个简单的方法概括,就是create();

2.具体汽车制造厂

具体汽车制造厂:实现了抽象工厂,具有实际的制造汽车的流程和方法等

3.抽象汽车

抽象汽车:汽车我们一般都知道,能跑,能放音乐,能导航,能转弯这些都是汽车的共性

4.具体汽车

抽象汽车:具体汽车实现了抽象汽车,具备其所有的功能,当然不同的汽车可能具备的功能还不一样

上述简单的做了介绍,大体而言就是,具体汽车厂制造相应的的汽车,比如:奥迪的工厂,制造奥迪汽车,大众的工厂,制造大众的汽车等

代码演示

上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:

(1)抽象汽车工厂

package com.zengtao.demo.factory;

/**
 * 抽象工厂
 */
public abstract class CarFactory {

    public abstract <T extends Car> T createCar(Class<T> cla);

}

(2)具体汽车工厂

package com.zengtao.demo.factory;

/**
 * 奥迪工厂
 */
public class AudiFactory extends CarFactory {

    @SuppressWarnings("unchecked")
    @Override
    public <T extends Car> T createCar(Class<T> cla) {
        Car car = null;
        try {
            car = (Car) Class.forName(cla.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) car;
    }

}

(3)定义抽象的车

package com.zengtao.demo.factory;

public abstract class Car {

    public abstract void drive();

    public abstract void selfNagive();

    public abstract void playMusic();

}

(4)具体的车

(奥迪q3)

package com.zengtao.demo.factory;

public class AudiQ3Car extends AudiCar {

    @Override
    public void drive() {
        System.out.println("AudiQ3Car  已经制造成功");
        System.out.println("AudiQ3Car  drive");
    }

    @Override
    public void selfNagive() {
        System.out.println("AudiQ3Car  selfNagive");
    }

    @Override
    public void playMusic() {
        System.out.println("AudiQ3Car  playMusic");
        System.out.println("");
    }
}

(奥迪q5)

package com.zengtao.demo.factory;

public class AudiQ5Car extends AudiCar {

    @Override
    public void drive() {
        System.out.println("AudiQ5Car  已经制造成功");
        System.out.println("AudiQ5Car  drive");
    }

    @Override
    public void selfNagive() {
        System.out.println("AudiQ5Car  selfNagive");
    }

    @Override
    public void playMusic() {
        System.out.println("AudiQ5Car  playMusic");
        System.out.println("");
    }

}

(5)调用

package com.zengtao.demo;

import com.zengtao.demo.factory.AudiFactory;
import com.zengtao.demo.factory.AudiQ3Car;
import com.zengtao.demo.factory.AudiQ5Car;

public class Main {

    public static void main(String[] str) {

        // 创建工厂
        AudiFactory audiFactory = new AudiFactory();

        // 利用工厂制造q3车
        AudiQ3Car audiQ3Car = audiFactory.createCar(AudiQ3Car.class);
         // 利用工厂制造q5车
        AudiQ5Car audiQ5Car = audiFactory.createCar(AudiQ5Car.class);

        // 开始开车放音乐
        audiQ3Car.drive();
        audiQ3Car.playMusic();

        audiQ5Car.drive();
        audiQ5Car.playMusic();

    }
}

(6)结果
这里写图片描述

以上呢,就里用工厂方法模式,实现了制造汽车的简单过程

第一点:

在抽象工厂中我们看到,createCar(Class cla)方法,我们为什么这样定义呢,使用反射去的方式去创建具体的车,这样,我们不同类型的车,只需要相应的条件,是不是都能产出了,所以这样写是有好处的,就像很多,奥迪有q3,q5,a4,a6,a7,a8等系列一样

第二点:

如果我们有其它的车,比如宝马,也具有宝马x1,320,x5等,我们也可以很简单的实现,只需要实现抽象工厂,然后具体汽车实现抽象car就好了,扩展也非常方便

总结

抽象工厂到这里也就差不多了,工厂方法模式是一个比较简单也挺好的一种设计模式

但是也有缺点,比如:如果有新的其它类型汽车,只需要实现抽象工厂和抽象汽车,也就新建两个类

但是如果不是汽车,是手机,那么,就要全部都写一遍,这样就会造成,非常多的类出现,是否采用工厂方法模式,还是根据需求来决定。

注意:大家也不要为了设计而去套用设计模式,当然工厂方法模式平时也很常用,比如:Activity的onCreate方法,我们也是根据自己定义的xml布局,加载生成相应的界面等等

好了,以上就到此结束,欢迎大家转载和分享。。。

版权声明:本文为博主原创文章,欢迎转载和分享,转载请标明出处!

Java设计模式之“工厂方法模式”

工厂方法模式 与简单工厂模式不同的是,简单工厂模式是工厂自己去实现对所有产品的构造的过程。根据不同的指令去生产对应的产品。但是,如果需求有变更,有新的产品需要去生产,或者有旧的产品不必去生产,都需要去...
  • DucklikeJAVA
  • DucklikeJAVA
  • 2016年03月25日 21:45
  • 522

Java设计模式之工厂方法模式【Factory Method Pattern】

工厂方法模式(FACTORY METHOD)是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的...
  • Lixuanshengchao
  • Lixuanshengchao
  • 2016年05月04日 21:27
  • 953

Java设计模式菜鸟系列(四)工厂方法模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39760895 工厂方法模式(Factory Method)分为三种: 一、普通工厂模式。...
  • JAVE_LOVER
  • JAVE_LOVER
  • 2014年10月04日 22:29
  • 2592

设计模式实战应用之五:工厂方法模式

工厂方法模式的应用相当广泛。工厂方法模式在 Java API 中的应用比比皆是:java.util.Collection 接口的 iterator 方法就是一个很著名的抽象工厂方法的示例;java.n...
  • defonds
  • defonds
  • 2014年07月30日 18:23
  • 4613

软件设计模式——工厂方法模式(Factory Method)

工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。通俗的来说就是把简单工厂模式里面的分支语句给去掉,将每个具体产品的实例化过程放到相应的产品中去。相应的角色如下: (1)抽象...
  • Jungle_hello
  • Jungle_hello
  • 2016年04月13日 22:51
  • 900

23种设计模式----创建型模式(工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式)

1.单例模式  单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自己实例化并向整个系统提供这个实例。   通用类图如下:      通用代码如下:public cl...
  • oChangWen
  • oChangWen
  • 2017年06月17日 21:37
  • 439

Java设计模式—工厂方法模式&抽象工厂模式

工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式。 通用类图如下:         在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义;C...
  • qq_25827845
  • qq_25827845
  • 2016年09月11日 15:07
  • 4683

工厂方法模式(Factory Method)-最易懂的设计模式解析

前言在上文提到的最易懂的设计模式系列解析:简单工厂模式,发现简单工厂模式存在一系列问题: 工厂类集中了所有实例(产品)的创建逻辑,一旦这个工厂不能正常工作,整个系统都会受到影响; 违背“开放 - 关闭...
  • carson_ho
  • carson_ho
  • 2016年08月28日 08:31
  • 3645

大话设计模式C++实现-第8章-工厂方法模式

一、UML图 二、包含的角色 (1)抽象工厂 (2)具体工厂 (3)抽象产品 (4)具体产品 三、优势 (1)工厂方法模式是对简单工厂模式的稍微的改进。工厂方法模式的用意是定义一个创建产品对象的工...
  • XD_lixin
  • XD_lixin
  • 2014年11月09日 22:26
  • 1829

Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法)

模式描述 提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。 2.模式作用 可以一定程度上解耦,消费者和产品实现类隔离开...
  • ooppookid
  • ooppookid
  • 2015年01月13日 15:09
  • 3358
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之工厂方法模式
举报原因:
原因补充:

(最多只允许输入30个字)