美文网首页
设计模式之抽象工厂模式

设计模式之抽象工厂模式

作者: smallstrong | 来源:发表于2017-04-13 11:42 被阅读18次

抽象工厂模式

抽象工厂UML.png
interface Shoe{
    void wear();
}

定义鞋类接口,定义公共方法穿鞋子。

interface Hat{
    void wear();
}

定义帽子类接口,定义公共方法戴帽子。

class LeatherShoe implements Shoe{
    public LeatherShoe(){
        
    }
    
    public void wear(){
        //穿皮鞋
    }
}

皮鞋实体类

class ClothShoe implements Shoe{
    public ClothShoe(){
        
    }
    
    public void wear(){
        //穿布鞋
    }
}   

布鞋实体类

class LeatherHat implements Hat{
    public LeatherHat(){
        
    }
    
    public void wear(){
        //带皮帽
    }
}

皮帽实体类

class ClothHat implements Hat{
    public ClothHat(){
        
    }
    
    public void wear(){
        //戴草帽
    }
}   

草帽实体类

interface Factory{
    Shoe createShoe();
    Hat creatHat();
}

工厂接口

class ClothFactory implements Factory{
    public Shoe createShoe(){
        ClothShoe clothShoe = new ClothShoe();
        return clothShoe;
    }
    public Hat creatHat(){
        ClothHat clothHat = new ClothHat();
        return clothHat;
    }
}

布料工厂类

class LeatherFactory implements Factory{
    public Shoe createShoe(){
        LeatherShoe leatherShoe = new LeatherShoe();
        return leatherShoe;
    }
    
    public Hat creatHat(){
        LeatherHat leatherHat = new LeatherHat();
        return leatherHat;
    }
}

皮料工厂类

class Client{
    public static void main(String args[]){
        Shoe mShoe;
        Hat mHat;
        Factory mFactory;
        mFactory = new ClothFactory();//创建布料工厂
        mShoe = mFactory.createShoe();//工厂生产鞋
        mHat = mFactory.creatHat();//工厂生产帽子
        mShoe.wear();//穿布鞋
        mHat.wear();//戴帽子
    }
}   

客户端

优点

  1. 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离, 更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接 口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。
  2. 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产 品族中的对象。
  3. 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点

  1. 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码, 这显然会带来较大的不便,违背了“开闭原则”。

相关文章

网友评论

      本文标题:设计模式之抽象工厂模式

      本文链接:https://www.haomeiwen.com/subject/welbattx.html