最近在看《headfirst 设计模式》,发现简单工厂,工厂模式,抽象工厂模式这三者的区别于联系不是太好理解,经过研究之后,写几个例子,加深一下印象。
上一篇介绍了简单工厂模式,《玩转简单工厂模式》,下面再写一个工厂模式的例子
package go.derek;
//这是一个抽象工厂类
public abstract class CarFactory{
abstract void brand();
abstract Car create(String type);
}
//宝马工厂,继承了抽象工厂类
class BmwFactory extends CarFactory{
public void brand(){
System.out.println("这是宝马工厂,采用 宝马 指定配件与制造工艺");
}
//宝马的工厂方法
public Car create(String type) {
if(type.equals("745Li")){
return new Bmw_745Li();
}
else if(type.equals("765Li")){
return new Bmw_765Li();
}
else
return null;
}
}
//奥迪工厂,继承了抽象工厂类
class AudiFactory extends CarFactory{
public void brand(){
System.out.println("这是奥迪工厂,采用 奥迪 指定配件与制造工艺");
}
//奥迪的工厂方法
public Car create(String type) {
if(type.equals("A8L")){
return new Audi_A8L();
}
else if(type.equals("A6L")){
return new Audi_A6L();
}
else
return null;
}
}
//小汽车的抽象类
abstract class Car{
abstract void intro();
}
//宝马745Li
class Bmw_745Li extends Car{
private String type="Bmw_745Li";
public void intro(){
System.out.println("这辆宝马的型号是"+type+"");
}
}
//宝马765Li
class Bmw_765Li extends Car{
private String type="Bmw_765Li";
public void intro(){
System.out.println("这辆宝马的型号是"+type+"");
}
}
//奥迪A8L
class Audi_A8L extends Car{
private String type="A8L";
public void intro(){
System.out.println("这辆奥迪的型号是"+type+"");
}
}
//奥迪A6L
class Audi_A6L extends Car{
private String type="A6L";
public void intro(){
System.out.println("这辆奥迪的型号是"+type+"");
}
}
package go.derek;
//测试类,模拟客户端调用
public class FactoryTest{
public static void main(String[] args){
//创建宝马工厂对象
CarFactory bmw=new BmwFactory();
//执行宝马工厂的流程
bmw.brand();
//获得指定型号的宝马车
Car car1=bmw.create("745Li");
car1.intro();
Car car2=bmw.create("765Li");
car2.intro();
//创建奥迪工厂对象
CarFactory audi=new AudiFactory();
//执行奥迪工程的流程
audi.brand();
//获得指定型号的奥迪车
Car car3=audi.create("A6L");
car3.intro();
Car car4=audi.create("A8L");
car4.intro();
}
}
运行结果如下
这是宝马工厂,采用 宝马 指定配件与制造工艺
这辆宝马的型号是Bmw_745Li
这辆宝马的型号是Bmw_765Li
这是奥迪工厂,采用 奥迪 指定配件与制造工艺
这辆奥迪的型号是A6L
这辆奥迪的型号是A8L
对比上一篇简单工厂设计模式,可以看出,产品Car基本一致,只不过工厂类有了区别,简单工厂是一个工厂生产所有汽车,工厂模式则是一个工厂只生产一种品牌的车。显然如果有很多品牌,很多型号的车的话,依赖关系要比简单模式简单的多,扩展起来也方便的多。