编程爱好者联盟 2016-10-23
简单工厂和工厂方法模式都是将对象的创建交由工厂处理,运用了工厂方法模式,我们代码中的if else被不同类型的具体工厂类所取代,这样在增加新的产品的时候不用修改原来的代码, 增加了可维护性。 当然这样做的后果就是项目中多了很多的类和接口, 增加了系统复杂性。简单工厂中的角色包括:
具体产品实现抽象产品接口。重写抽象产品中的抽象方法,是其具有具体产品自己的方法特征,每个具体的产品由同一个工厂类创建。先看一下每个角色的代码实现
工厂类:Factory.java
package com.songpu.dp.factory; public class Factory { public Food createFood(){ return new Food(); } public Toy createToy(){ return new Toy(); } }
抽象产品:Product.java
package com.songpu.dp.factory; public interface Product { public void operatet(); }
具体产品:Toy.java和Food.java
package com.songpu.dp.factory; public class Toy implements Product{ @Override public void operatet() { System.out.println("play toy"); } }
package com.songpu.dp.factory; public class Food implements Product{ @Override public void operatet() { System.out.println("eat food"); } }
测试一下
package com.songpu.dp.test; import com.songpu.dp.factory.*; import static org.junit.Assert.*; import org.junit.Test; public class testFactory { @Test public void test() { Factory f = new Factory(); Product food; Product toy; food = f.createFood(); toy=f.createToy(); food.operatet(); toy.operatet(); } }
最后的执行结果如下
在简单工厂中,如果需要增加一个产品的创建,就必须在工厂类中增加创建产品的代码,这不符合设计模式中的开闭原则(一个软件实体应该通过扩展来实现变化,而不是通过修改已有代码来实现变化),所以工厂方法模式就是对简单工厂的改进,增加一个抽象工厂的角色,可以通过实现该抽线工厂来扩展具体工厂类。
这里代码的改动就是在增加了抽象工厂,具体工厂类实现抽象工厂,并且每个具体的产品由响应的一个工厂类创建。
抽象工厂:Factory.java
package com.songpu.dp.factorymethod; public interface Factory { public Product createProduct(); }
具体工厂类:FoodFactory.java和ToyFood.java
package com.songpu.dp.factorymethod; public class FoodFactory implements Factory { @Override public Product createProduct() { return new Food(); } }
package com.songpu.dp.factorymethod; public class ToyFactory implements Factory { @Override public Product createProduct() { return new Food(); }
抽象产品:Product.java与具体产品类:Food.java和Toy.java的代码和上面的一致。
测试一下
package com.songpu.dp.test; import com.songpu.dp.factorymethod.*; import static org.junit.Assert.*; import org.junit.Test; public class testProductMethod { @Test public void test() { FoodFactory ff = new FoodFactory(); ToyFactory tf = new ToyFactory(); Product food; Product toy; food = ff.createProduct(); toy = tf.createProduct(); food.operate(); toy.operate(); } }
最后执行的结果如下