JAVA设计模式:工厂方法(Factory Method)
工厂方法是一种类的创建模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类。当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时我们就需要用到工厂方法模式了。
工厂方法可以根据不同的条件产生不同的实例,当然这些不同的实例通常是属于相同的类型,具有共同的父类。工厂方法把创建这些实例的具体过程封装起来了,简化了客户端的应用,也改善了程序的扩展性,使得将来可以做最小的改动就可以加入新的待创建的类。
定义一个抽象类用来描述“人”,代码如下:
1 public interface Human{ 2 3 void eat(); 4 5 void walk(); 6 7 }
两个实现类,中国人和美国人。代码如下:
public class American implements Human{ public void eat(){ System.out.println("美国人吃面包香肠,喝啤酒可乐,脂肪超标。"); } void walk(){ System.out.println("美国人出门就坐车,四肢萎缩。"); } } public class Chinese implements Human{ public void eat(){ System.out.println("中国人吃大米白饭,身强体壮。"); } void walk(){ System.out.println("中国人都会轻功,飞檐走壁。"); } }
工厂类,代码如下:
public class HumanFactory{ public Human createChinese(){ return new Chinese(); } public Human createAmerican(){ return new American(); } }
通过上面的代码可以看出,程序创建Human类并不是直接通过new关键字创建,而是通过HumanFactory的两个工厂方法来创建,在工厂方 法内部,我们成功的隐藏了类的创建细节。另外,工厂方法返回的是Human接口,而不是某个具体实现类,这样将来我们有了更好的实现时,可以很方便的在工 厂方法内部进行替换而不用修改其它的代码。
另外还有一种叫抽象工厂(Abstract Factory)的设计模式。和前面提到的工厂方法非常相似,只不过是在工厂层面作了更高一层的抽象,看代码:
public interface HumanFactory{ Human create(String type); }
和工厂方法不同,在抽象工厂设计模式中,工厂也变成了一个接口,下面是实现类:
public class StandardHumanFactory implements HumanFactory{ public Human create(String type){ if("chinese".equals(type)){ return new Chinese(); } if("american".equals(type)){ return new American(); } //下面省略掉 } }
看出意思了吧,通过使用工厂方法,当被生产的对象发生变化时我们不需要调整业务代码,而抽象工厂使得我们在对象的创建逻辑发生变化时也不用调整代码。
浙公网安备 33010602011771号