设计模式-工厂方法模式

/ 技术相关 / 0 条评论 / 850浏览

我的时光机设计模式-单例模式


什么是工厂方法模式呢?下面我们先来看下它的定义:Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.(定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。)下面我们来看一段源码。

package com.designpattern.FactoryMethod;

/**
 * 播放器
 * <p>
 * Created by yaoyc on 2018/6/10.
 */
public abstract class MusicPlayer {

    /**
     * 播放音乐,音乐播放器公共方法
     */
    public void play() {
        System.out.println("MusicPlayer开始播放音乐了");
    }

    /**
     * 每种播放器暂停方法不一样
     */
    public abstract void pause();
}
/**
 * MP4播放器
 * <p>
 * Created by yaoyc on 2018/6/10.
 */
public class Mp3Player extends MusicPlayer {


    /**
     * mp3播放方法,Mp3Player也可以重写父类方法,实现自己的播放方法。
     * 重写方法的规则:
     * 1)、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
     * 2)、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
     * 3)、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
     * 4)、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常,大家可以想一下为什么。
     */
    @Override
    public void play() {
        System.out.println("mp3开始播放音乐");
    }


    /**
     * mp3暂停方法
     */
    @Override
    public void pause() {
        System.out.println("mp3播放暂停了");
    }
}
/**
 * MP4播放器
 * <p>
 * Created by yaoyc on 2018/6/10.
 */
public class Mp4Player extends MusicPlayer {

    /**
     * mp4暂停方法
     */
    @Override
    public void pause() {
        System.out.println("mp4播放暂停了");
    }
}
/**
 * 抽象工厂
 * <p>
 * Created by yaoyc on 2018/6/10.
 */
public abstract class MusicPlayerCreator {
    /**
     * 创造一个播放器,输入类型可以自行设置
     * 通常是String、Enum、Class等,当然也可以为空
     *
     * @param tClass
     * @param <T>
     * @return
     */
    public abstract <T extends MusicPlayer> T creatorMusicPlayer(Class<T> tClass);
}
/**
 * 具体的制造工厂
 * <p>
 * Created by yaoyc on 2018/6/10.
 */
public class ConcreatePlayerCreator extends MusicPlayerCreator {

    @Override
    public <T extends MusicPlayer> T creatorMusicPlayer(Class<T> tClass) {
        MusicPlayer musicPlayer = null;
        try {
            musicPlayer = (MusicPlayer) Class.forName(tClass.getName()).newInstance();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return (T) musicPlayer;
    }
}
public class FactoryMethodTest {
    @Test
    public void test(){
        MusicPlayerCreator musicPlayerCreator = new ConcreatePlayerCreator();
        //我想要一个MP3,给我造一个
        Mp3Player mp3Player = musicPlayerCreator.creatorMusicPlayer(Mp3Player.class);
        //MP3播放音乐
        mp3Player.play();
        //MP3暂停播放音乐
        mp3Player.pause();
        //我想要一个MP3,给我造一个
        Mp4Player mp4Player = musicPlayerCreator.creatorMusicPlayer(Mp4Player.class);
        //MP4播放音乐
        mp4Player.play();
        //MP4暂停播放音乐
        mp4Player.pause();
    }
}

工厂方法模式的优点: