简略工厂模式是由工厂对象决定创立哪一种产品,尽管不属于23种设计模式,然而也是工厂模式进阶的由来。

模仿场景:

寒假太过无聊,就本人在家打算做一个MP3播放器,其中包含播放器的程序设计也是本人来搞定的。如下构造

//歌曲播放接口public interface ISong {    void  Play();}
//流行歌曲播放public class PopularISong implements ISong {    @Override    public void Play() {        System.out.println("接下来播放流行歌曲~");    }}
//古典歌曲播放public class ClassicalSongs  implements ISong {    @Override    public void Play() {        System.out.println("接下来播放古典歌曲~");    }}
//MP3播放操作public class MP3 {    public  enum  SongType    {       PopularSongType,//流行歌曲       ClassicalSongsType//古典歌曲       //....其余类型    }    public ISong Pay(SongType type)    {        if(type==SongType.PopularSongType)        {            return new PopularISong();        }        else if(type==SongType.ClassicalSongsType)        {            return new ClassicalSongs();        }        return  null;    }}
public class Text {    public static void main(String[] args) {        //用户执行操作        MP3 mp3=new MP3();        mp3.Pay(MP3.SongType.PopularSongType).Play();    }}

[
](https://jq.qq.com/?_wv=1027&k...

程序终于写完了~我在沙发上惬意的用MP3放着流行歌曲,奶奶走过去问我能不能放戏曲,我摸了摸脑袋,说:“也能够”。不过你得等我一下。

1个小时之后,通过从新装配硬件,编写代码,减少了戏曲的类,又从新批改了MP3类中if else分支。

else  if(type==SongType.TraditionalOperaType)//戏曲{    //.....}

给奶奶用了之后,很称心还通知我爸褒扬我,我爸晓得了嚷嚷要听相声。我心想这不是又要再去写一遍代码.....这显然不行。
[
](https://jq.qq.com/?_wv=1027&k...

简略工厂模式中蕴含了必要的逻辑判断,依据用户抉择的条件动静实例化生成相干的类,明确辨别了各自的职责和势力。然而这里也违反了凋谢-关闭准则,工厂类集中了所有的逻辑判断,一旦要减少一个还得批改逻辑判断的代码。

工厂模式

有了上述的教训,我决定从新改写程序,以避免他们又想听其它类型的歌曲,我又要从新批改代码逻辑判断。

//工厂类public interface IFactory {    ISong CreateSong();}
//产品歌曲类public interface ISong {    void  Play();}

具体工厂类:

//具体工厂类 用于创立流行歌曲public class PopularSongFactory  implements  IFactory{    @Override    public ISong CreateSong() {        return  new PopularISong();    }}
//具体工厂类 用于创立古典歌曲public class ClassicalSongsFactory implements  IFactory{    @Override    public ISong CreateSong() {        return new ClassicalSongs();    }}

具体歌曲类:

//具体歌曲类:古典public class ClassicalSongs  implements ISong {    @Override    public void Play() {        System.out.println("接下来播放古典歌曲~");    }}
//具体歌曲类:风行public class PopularISong implements ISong {    @Override    public void Play() {        System.out.println("接下来播放流行歌曲~");    }}

用户操作层面:

public static void main(String[] args) {    //用户执行操作    IFactory factory=new ClassicalSongsFactory();//古典工厂  只须要更改这里的类型,选择权交给用户去生成对应的实例    ClassicalSongs songs= (ClassicalSongs) factory.CreateSong();    songs.Play();}

[
](https://jq.qq.com/?_wv=1027&k...
[
](https://jq.qq.com/?_wv=1027&k...

工厂模式把要决定实例化哪一个工厂的抉择判断放到了客户端,放弃了简略工厂模式的长处又克服了毛病,不须要做大的变动就能够扭转,升高了程序的耦合,然而每须要减少一个类型的时候,又须要创立一个产品和工厂。这个能够利用反射来解决分支判断的问题。

最初,祝大家早日学有所成,拿到称心offer,疾速升职加薪,走上人生巅峰。

能够的话请给我一个三连反对一下我哟??????【白嫖材料】