欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

工厂方法模式

程序员文章站 2022-06-15 14:18:18
...

    工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

工厂方法模式

一、实现

(一)抽象产品
/** 
 * 抽象人类,三个属性 
 * @author EX-SONGTIANXI001 
 * 
 */  
public interface Human {  
    /*笑*/  
    public void laugh();  
      
    /*哭*/  
    public void cry();  
      
    /*说话*/  
    public void talk();  
      
}  

(二)具体产品
public class WhiteHuman implements Human{  
    /*笑*/  
    public void laugh(){  
        System.out.println("白种人笑");  
    };  
      
    /*哭*/  
    public void cry(){  
        System.out.println("白种人哭");  
    };  
      
    /*说话*/  
    public void talk(){  
        System.out.println("白种人说话");  
    };  
      
}  
  
public class YellowHuman implements Human{  
    /*笑*/  
    public void laugh(){  
        System.out.println("黄种人笑");  
    };  
      
    /*哭*/  
    public void cry(){  
        System.out.println("黄种人哭");  
    };  
      
    /*说话*/  
    public void talk(){  
        System.out.println("黄种人说话");  
    };  
      
}  
  
public class BlackHuman implements Human{  
    /*笑*/  
    public void laugh(){  
        System.out.println("黑种人笑");  
    };  
      
    /*哭*/  
    public void cry(){  
        System.out.println("黑种人哭");  
    };  
      
    /*说话*/  
    public void talk(){  
        System.out.println("黑种人说话");  
    };  
      
}  

(三)抽象工厂

public abstract class Factory{
    // 创建人类    
    public abstract Human creatHuman();   
    
}



(四)具体工厂
public WhiteFactory extends Factory{
    // 创建白人工厂
    @Override
    public Human creatHuman(){
        return new WhiteHuman();
    }
}

public YellowFactory extends Factory{
    // 创建黄种人工厂
    @Override
    public Human creatHuman(){
        return new YellowHuman();
    }
}

public BlackFactory extends Factory{
    // 创建黑人工厂
    @Override
    public Human creatHuman(){
        return new BlackHuman();
    }
}


二、总结

(一)优点
    1.符合开-闭原则:新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可。
    2.符合单一职责原则:每个具体工厂类只负责创建对应的产品。
    3.不使用静态工厂方法,可以形成基于继承的等级结构。
(二)缺点
    1.添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销。
    2.由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
    3.虽然保证了工厂方法内的对修改关闭,但对于使用工厂方法的类,如果要更换另外一种产品,仍然需要修改实例化的具体工厂类。

    4.一个具体工厂只能创建一种具体产品。

(三)应用场景
    1.对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。Java Collection中的iterator() 方法即属于这种情况。
    2.只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。



相关标签: 工厂方法模式