设计模式之简单工厂和工厂方法模式

简单工厂和工厂方法模式都是将对象的创建交由工厂处理,运用了工厂方法模式,我们代码中的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("Toy被生产");
	}
}
package com.songpu.dp.factory;
public class Food  implements Product{
	@Override
	public void operatet() {
		System.out.println("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();
	}
}

最后的执行结果如下

Food被生产
Toy被生产

在简单工厂中,如果需要增加一个产品的创建,就必须在工厂类中增加创建产品的代码,这不符合设计模式中的开闭原则(一个软件实体应该通过扩展来实现变化,而不是通过修改已有代码来实现变化),所以工厂方法模式就是对简单工厂的改进,增加一个抽象工厂的角色,可以通过实现该抽线工厂来扩展具体工厂类。

这里代码的改动就是在增加了抽象工厂,具体工厂类实现抽象工厂,并且每个具体的产品由响应的一个工厂类创建。

  • 角色
    • 抽象工厂
    • 具体工厂类
    • 抽象产品
    • 具体产品类

抽象工厂: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 Toy();
	}

抽象产品: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();
	}
}

最后执行的结果如下

Food被生产
Toy被生产

posted on 2016-08-23 11:58  Guangjs  阅读(296)  评论(0编辑  收藏  举报