工厂方法模式和抽象工厂模式


 

前言:

    工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
 
  而工厂模式有根据抽象程度不同分为简单工厂,工厂方法和抽象工厂;借用网上一大神的概括,如下:

  看了网络上很多关于设计模式的方法,有的模式看起来相似,但本质还是区别很大的.像简单工厂,工厂方法和抽象工厂就有很明显的区别.

  有一个比较好理解的例子,在这跟大家介绍下:

  1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.

  2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.

  3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.

  所以我个人认为,简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.

1、工厂方法模式(Factory Method)

 

1.1、普通工厂模式(静态工厂)就是建立一个工厂类,对实现了同一接口的一些类根据用户需求进行实例的创建。首先看下关系图:

    

 概念这些比较绕,直接举例吧!(我们举个手机工厂的子)

 第一步:创建一个手机接口,定义一个生产手机的公共方法;

  

public interface MobilePhone {
    
  public void production ();
  
}

第二步:创建具体实现类

 

public class HuaWei implements MobilePhone{

    public void production() {
        // TODO Auto-generated method stub
        System.out.println("华为手机生产");
    }

}



public class Vivo implements MobilePhone{

    public void production() {
    
        System.out.println("vivo手机生产");
    }

}

 

第三步:创建工厂类

public class MobilePhoneFactory {

    public MobilePhone  produceFactory(String name){
        
        if ("HuaWei".equals(name)) {  
            return new HuaWei();  
        } else if ("Vivo".equals(name)) {  
            return new Vivo();  
        } else {  
            System.out.println("请输入正确的类型!");  
            return null;  
        }  
        
    }
}

最后测试一下

 

public class Test {
public static void main(String[] args) {
    MobilePhoneFactory m=new MobilePhoneFactory();
    MobilePhone mobilePhone=m.produceFactory("Vivo");
    mobilePhone.production();
}
}

 

输出:vivo手机生产

总结:简单工厂相当于一个模子,根据传入的参数通过一些自己的逻辑判断;生产出不同类型的相应的产品、对象。但这种模式局限性很大,一但参数错误,就不能做出正确的操作,而且新增一些产品就要更改工厂类;所以这种模式一般用于比较简单的场景;

1.2、多个工厂方法模式

 

  多个工厂方法模式是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而且新增一些产品就要更改工厂类;而多个工厂方法模式是提供多个工厂方法,分别创建对象。

  

 

  只要将上面的工厂做下修改即可;如下:

 

public abstract class Factory {
    
 public abstract MobilePhone getMobilePhone();
}


public class HuaWeiFactory extends Factory{

    @Override
    public MobilePhone getMobilePhone() {
        // TODO Auto-generated method stub
        return new HuaWei();
    }

}



public class VivoFactory extends Factory{

    @Override
    public MobilePhone getMobilePhone() {
        // TODO Auto-generated method stub
        return new Vivo();
    }

}

 

 

 

测试如下:


public class Test {
public static void main(String[] args) {
    Factory m=new HuaWeiFactory();
    MobilePhone mobilePhone=m.getMobilePhone();
    mobilePhone.production();
}
}

输出:华为手机生产

 
2:抽象工厂
 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类;如下图:

还是用手机的例子,但现在生产手机的同时还要生产配套的充电器;增加代码如下:

 

public interface MobilepHoneAccessories {
     public void production ();
}



public class VivoTheCharger implements MobilepHoneAccessories{

    public void production() {
        // TODO Auto-generated method stub
        System.out.println("vivo充电器生产");
    }

}


public class HuaWeiTheCharger  implements MobilepHoneAccessories{

    public void production() {
        System.out.println("华为充电器生产");
        
    }

}

 

工厂修改如下:

public abstract class Factory {
//手机生产    
 public abstract MobilePhone getMobilePhone();
 //充电器生产
 public abstract MobilepHoneAccessories getThrCharger();
}



public class HuaWeiFactory extends Factory{

    @Override
    public MobilePhone getMobilePhone() {
        // TODO Auto-generated method stub
        return new HuaWei();
    }

    @Override
    public MobilepHoneAccessories getThrCharger() {
        // TODO Auto-generated method stub
        return new HuaWeiTheCharger();
    }

}


public class VivoFactory extends Factory{

    @Override
    public MobilePhone getMobilePhone() {
        // TODO Auto-generated method stub
        return new Vivo();
    }

    @Override
    public MobilepHoneAccessories getThrCharger() {
        // TODO Auto-generated method stub
        return  new VivoTheCharger();
    }

}

测试如下:

public class Test {
public static void main(String[] args) {
    Factory m=new HuaWeiFactory();
    MobilePhone mobilePhone=m.getMobilePhone();
    MobilepHoneAccessories mha=m.getThrCharger();
    mobilePhone.production();
    mha.production();
}
}

输出:华为手机生产
  华为充电器生产

总结:

  简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

  工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)  
  抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM