玩转抽象工厂模式(一)

2014-11-24 08:59:09 · 作者: · 浏览: 5
最近在看《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();  
    }  
}  

运行结