java设计模式之——工厂模式
对于java的设计模式,我还是第一次认认真真的总结,以前用的时候都不曾留意细节,现在回头再看只知道该怎么设计,却忘记当时为嘛要用它了,
所以这次就做一个demo来再次复习总结一下,希望从中能学到新体悟。先说说设计模式最重要的一个原则吧,就是开闭原则:意思是对扩展开放,对修改关闭
在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。
想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到这点。
1、简单的工厂模式
以小明,小雨吃饭睡觉为例:
首先创建一个Human.java接口,该接口的作用相当于女娲造人,它为人类定义了吃饭睡觉的能力
public interface Human { public abstract void sleep(); public abstract void eat(); }
Xiaoming.java,实现了Human接口
public class Xiaoming implements Human { public void sleep(){ System.out.println(" ----小明睡觉了---- "); } public void eat(){ System.out.println(" ----小明吃饭了!---- "); } }
Xiaoyu.java同上
public class Xiaoyu implements Human { public void sleep() { System.out.println("小雨睡觉了"); } public void eat() { System.out.println("小雨吃饭了"); } }
最后我们建个工厂类HumanFactory.java
public class HumanFactory(){ public Human getHuman(String name){ if("Xiaoming".equals(name)){ return new Xiaoming(); }esle if("Xiaoyu".equals(name)){ return new Xiaoyu(); }else{ return null; } } }
测试类:
public class HumanTest{ @Test public void test1(){ HumanFactory provider = new HumanFactory(); Human xiaoming = provider.getHuman("xiaoming"); xiaoming.sleep(); } }
输出:----小明睡觉了----
2、多个工厂模式
多个工厂模式是对简单工厂模式的改进,对HumanFactory.java做一下修改就可以了:
public class CarFactory { public Car getXiaoming(){ return new Xiaoming(); } public Car getXiaoyu(){ return new Xiaoyu(); } }
测试类:
public class HumanTest{ @Test public void test1(){ HumanFactory provider = new HumanFactory(); Human xiaoming = provider.getXiaoming(); xiaoming.sleep(); } }
输出:----小明睡觉了----
3、静态 工厂模式,同样对HumanFactory.java做一下修改就可以了:
public class CarFactory { public static Car getXiaoming(){ return new Xiaoming(); } public static Car getXiaoyu(){ return new Xiaoyu(); } }
测试类:
public class HumanTest{ @Test public void test1(){ Human xiaoming = HumanFactory.getXiaoming(); xiaoming.sleep(); } }
输出:----小明睡觉了----
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。
在以上的三种模式中,第一种如果传入的字 符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,
所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
4、抽象工厂模式
同样的以Human为例:
首先创建同一接口:
public interface Human { public abstract void sleep(); public abstract void wakeup(); }
一下两个类:
public class Xiaoming implements Human { public void sleep(){ System.out.println(" ----小明睡觉了---- "); } public void wakeup(){ System.out.println(" ----小明醒了!---- "); } }
public class Xiaoyu implements Human { public void sleep() { System.out.println("小雨睡觉了"); } public void wakeup() { System.out.println("小雨睡醒了"); } }
提供两个工厂类
public class XiaomingFactory implements FactoryProvider{ public Human produce() { return new Xiaoming(); } }
public class XiaoyuFactory implements FactoryProvider{ public Human produce() { return new Xiaoyu(); } }
实现同一个接口:
public interface FactoryProvider { public Human produce(); }
测试类:
public class HumanTest{ @Test public void test1(){ FactoryProvider provider = new XiaomingFactory(); Human xiaoming = provider.produce(); xiaoming.sleep(); } }
输出:小明睡觉了。
其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。
这样做,拓展性较好!