乐趣区

关于java:面试官被我安排上了理由是我把工厂模式探的清清楚楚hhh

简略工厂模式是由工厂对象决定创立哪一种产品,尽管不属于 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,疾速升职加薪,走上人生巅峰。

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

退出移动版