自我介绍
你好! 这是我第一次使用优快云发表文章 ,本人从事Java后端和基于Vue.js、ES6和Element-UI的前端开发,以后请大家多多指教,有出错或需要修改的地方麻烦你们指导出来,不胜感激。刚开始接触优快云查询相关资料,我发现很多人基本上都省略了一些大家默认知道的东西,这对刚入行的新人来说是不清楚的,所以看起来特别费劲。我现在是以一个新人的视角去分享我的学习笔记,以便于自己学习和获得大家的指导。以后我会不定期分享我的学习笔记和工作中的出现的问题和解决办法。希望大家多多指导!!!
工厂方法
定义一个用于创建对象的接口,让子类决定实例化哪一个类 :
- 核心思想: 将类中不变的部分抽象出来封装成接口,将其中个性化善变的部分为封装为独立类,通过依赖注入的方式以达到解耦、复用和方便后期维护和拓展的目的;
- 基本组成:抽象工厂、具体工厂、抽象产品和具体产品四个部分;
- 优点:多态,可以返回原类型的任何子类型;拓展性好,一定程度上减少了代码的修改量,添加一个新产品只需要添加一个产品类和一个实体类。符合“开闭原则”;
- 缺点:添加新的产品时,需要成对添加产品类和工厂类,一定程度上添加了系统的复杂度,增加了系统的抽象性和理解难度,且在实现可能需要引入DOM、反射等技术,一定程度上增加了系统的实现难度
实例演示
//抽象产品,封装产品中公有的部分
public interface Player {
void play(File file); // 播放
}
//具体产品,定义个性化善变的部分,可以有一至多个
public class VideoPlayer implements Player {
@Override
public void play(File file){
System.out.println("播放视频!!");
}
}
//具体产品,定义个性化善变的部分
public class MusicPlayer implements Player {
@Override
public void play(File file){
System.out.println("播放音乐!!");
}
}
// 抽象工厂,封装工厂中公有的部分
public interface PlayerFactory {
Player createPlayer();
}
//具体工厂,与具体产品相对应
public class VideoPlayerFactory implements PlayerFactory {
@Override
public Player createPlayer(){
return new VideoPlayer();
}
}
//具体工厂,与具体产品相对应
public class MusicPlayerFactory implements MusicPlayerFactory {
@Override
public Player createPlayer(){
return new MusicPlayer();
}
}
//主类,具体调用
public class Main {
public static void main(String[] args){
VideoPlayerFactory videoFactory = new VideoPlayerFactory();
Player videoPlayer = videoFactory .createPlayer();
File file = new File("csdn.mp4");
videoPlayer.play(file);
MusicPlayerFactory musicFactory = new MusicPlayerFactory();
Player musicPlayer = musicFactory.createPlayer();
File musicFile = new File("lsr.mp3");
musicPlayer.play(musicFile );
}
}
个人总结和使用场景
一句话总结工厂模式:便于创建 同种产品不同类型的 复杂参数 对象,降低创建和调用难度
工厂模式适用于构建同产品的不同类型(实现了同一个基类)的不同对象时,对象构造器很复杂(有很多的参数),而且这些参数中大部分都是固定的,这时就可以用工厂模式进行封装。