简略工厂模式是由工厂对象决定创立哪一种产品,尽管不属于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,疾速升职加薪,走上人生巅峰。
能够的话请给我一个三连反对一下我哟??????【白嫖材料】