最近在看《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
这辆车在 德国 制造,销往欧洲地区
由这个例子可见,抽象工厂模式与工厂模式的区别就在与前者是以组合的形式来扩展,而后者是以继承的形式。两者都有特定的应用场景,工厂模式在增加产品方面很在行,但是对扩展非产品的需求则显得力不从心了。抽象设计模式则不然,增加产品不是他的本行,扩展非增加产品的需求时就很给力了。两者都是很重要的设计模式,值得好好去体会~