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