当前位置:编程学习 > JAVA >>

玩转抽象工厂模式

最近在看《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;  
    }  
}  
//定义制造地点的一个借口  
inte易做图ce 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
这辆车在 德国 制造,销往欧洲地区 
 
由这个例子可见,抽象工厂模式与工厂模式的区别就在与前者是以组合的形式来扩展,而后者是以继承的形式。两者都有特定的应用场景,工厂模式在增加产品方面很在行,但是对扩展非产品的需求则显得力不从心了。抽象设计模式则不然,增加产品不是他的本行,扩展非增加产品的需求时就很给力了。两者都是很重要的设计模式,值得好好去体会~
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,