`
844604778
  • 浏览: 551560 次
文章分类
社区版块
存档分类
最新评论

玩转抽象工厂模式

阅读更多

最近在看《headfirst 设计模式》,发现简单工厂,工厂模式,抽象工厂模式这三者的区别于联系不是太好理解,经过研究之后,写几个例子,加深一下印象。

上一篇介绍了工厂模式,《玩转工厂模式》,下面再写一个例子来加深一下对抽象工厂模式的理解。

package go.derek;
//这是一个抽象工厂类
public abstract class CarFactory{
	abstract void brand();
	abstract Car create(String type);
}
//宝马工厂,继承了抽象工厂类
class BmwFactory extends CarFactory{
	//将制造地点组合进宝马工厂
	MakeUpFactory makeUpFactory;
	BmwFactory(MakeUpFactory mf){
		this.makeUpFactory=mf;
	}
	public void brand(){
		System.out.println("这是宝马工厂,采用 宝马 指定配件与制造工艺");
	}
	//宝马的工厂方法
	public Car create(String type) {
		if(type.equals("745Li")){
			return new Bmw_745Li(makeUpFactory);
		}
		else if(type.equals("765Li")){
			return new Bmw_765Li(makeUpFactory);
		}
		else
			return null;
	}
}
//奥迪工厂,继承了抽象工厂类
class AudiFactory extends CarFactory{
	//将制造地点组合进奥迪工厂
	MakeUpFactory makeUpFactory;
	AudiFactory(MakeUpFactory mf){
		this.makeUpFactory=mf;
	}
	public void brand(){
		System.out.println("这是奥迪工厂,采用 奥迪 指定配件与制造工艺");
	}
	//奥迪的工厂方法
	public Car create(String type) {
		if(type.equals("A8L")){
			return new Audi_A8L(makeUpFactory);
		}
		else if(type.equals("A6L")){
			return new Audi_A6L(makeUpFactory);
		}
		else
			return null;
	}
}
//定义制造地点的一个借口
interface MakeUpFactory{
	 void make(String type);
}
//中国工厂
class ChinaFactory implements MakeUpFactory{
	public void make(String type){
		System.out.println("这辆车在 中国 制造 ,销往东亚地区");
	}
}
//德国工厂
class GermanyFactory implements MakeUpFactory{
	public void make(String type){
		System.out.println("这辆车在 德国 制造,销往欧洲地区 ");
	}
}
//小汽车的抽象类
abstract class Car{
	//获得小汽车的同时要指定制造地点
	MakeUpFactory makeUpFactory;
	abstract void intro();
}
//宝马745Li
class Bmw_745Li extends Car{
	public Bmw_745Li(MakeUpFactory mf){
		this.makeUpFactory=mf;
	}
	private String type="Bmw_745Li";
	public void intro(){
		System.out.println("这辆宝马的型号是"+type+"");
		makeUpFactory.make(type);
	}
}
//宝马765Li
class Bmw_765Li extends Car{
	public Bmw_765Li(MakeUpFactory mf){
		this.makeUpFactory=mf;
	}
	private String type="Bmw_765Li";
	public void intro(){
		System.out.println("这辆宝马的型号是"+type+"");
		makeUpFactory.make(type);
	}
}
//奥迪A8L
class Audi_A8L extends Car{
	public Audi_A8L(MakeUpFactory mf){
		this.makeUpFactory=mf;
	}
	private String type="A8L";
	public void intro(){
		System.out.println("这辆奥迪的型号是"+type+"");
		makeUpFactory.make(type);
	}
}
//奥迪A6L
class Audi_A6L extends Car{
	public Audi_A6L(MakeUpFactory mf){
		this.makeUpFactory=mf;
	}
	private String type="A6L";
	public void intro(){
		System.out.println("这辆奥迪的型号是"+type+"");
		makeUpFactory.make(type);
	}
}
package go.derek;
//测试类,模拟客户端调用
public class FactoryTest{
	public static void main(String[] args){
		//创建中国工厂,和德国工厂
		MakeUpFactory china=new ChinaFactory(); 
		MakeUpFactory germany=new GermanyFactory(); 
		//创建宝马工厂对象,以制造地点为构造参数
		CarFactory bmw=new BmwFactory(china);
		//执行宝马工厂的流程
		bmw.brand();
		//获得指定型号的宝马车
		Car car1=bmw.create("745Li");
		car1.intro();
		Car car2=bmw.create("765Li");
		car2.intro();
		//创建奥迪工厂对象,以制造地点为构造参数
		CarFactory audi=new AudiFactory(germany);
		//执行奥迪工程的流程
		audi.brand();
		//获得指定型号的奥迪车
		Car car3=audi.create("A6L");
		car3.intro();
		Car car4=audi.create("A8L");
		car4.intro();
	}
}
运行结果如下

这是宝马工厂,采用 宝马 指定配件与制造工艺
这辆宝马的型号是Bmw_745Li
这辆车在 中国 制造 ,销往东亚地区
这辆宝马的型号是Bmw_765Li
这辆车在 中国 制造 ,销往东亚地区
这是奥迪工厂,采用 奥迪 指定配件与制造工艺
这辆奥迪的型号是A6L
这辆车在 德国 制造,销往欧洲地区
这辆奥迪的型号是A8L
这辆车在 德国 制造,销往欧洲地区

由这个例子可见,抽象工厂模式与工厂模式的区别就在与前者是以组合的形式来扩展,而后者是以继承的形式。两者都有特定的应用场景,工厂模式在增加产品方面很在行,但是对扩展非产品的需求则显得力不从心了。抽象设计模式则不然,增加产品不是他的本行,扩展非增加产品的需求时就很给力了。两者都是很重要的设计模式,值得好好去体会~

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics