工厂模式

  工厂,顾名思义是生产很多产品的地方,而且会有不同种类的产品,例如手机工厂,可能会生产小米手机、华为手机、诺基亚手机等等,这些不同品牌的手机可能会有自己单独的生产车间,这样一个手机工厂就相当于被分成了小米手机车间,生产小米手机、华为手机车间,生产华为手机、诺基亚手机车间,生产诺基亚手机。这样的引入大家应该比较明了的知道了工厂是什么。

工厂模式

  1. 简单工厂:其实它不是一个设计模式,而是一种编程习惯,但是很多开发人员会把这个编程习惯当做“工厂模式”。
  2. 工厂方法模式
  3. 抽象工厂模式

1、简单工厂

  建立一个工厂,来制造对象,此时工厂只是将客户创建对象的方法收集起来,对象是由客户自己创建的,当客户需要对象时,就到工厂中创建,然后拿来使用即可。就像手机品牌商都会制造手机,当他们销售出手机时,直接到工厂中自己制造出手机,然后拿走去销售。

public class PhoneFactory{
  public static Phone createPhone(String type){
    Phone phone = null;
    if(type.equals("小米")){
      phone = new XiaomiPhone();    
    }else if(type.equals("华为")){
        phone = new HuaweiPhone();
    }else if(type.equals("诺基亚")){
        phone = new NuojiyaPhone();
    }
    return phone;
 }  
}    

public class PhoneStore{
   public Phone orderPhone(String type){
      Phone phone;
      phone = PhoneFactory.createPhone(type);
      phone.box();
      return phone;
    } 
//这里是其他方法
}    

            

2、工厂方法模式

  创建了一个对象接口,但由其子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

  手机工厂就可以看做一个工厂方法模式,工厂是暴露给外界的对象接口,各个品牌手机生产车间都继承与工厂,都是工厂的子类,他们负责生产具体哪个品牌的手机,而工厂不负责生产手机,只负责为各个生产车间提供房屋,仪器,工人(这些都类似与抽象类中的抽象方法),工厂并不关心各个车间怎么使用这些资源,具体怎么使用,由他们自己决定(继承了抽象类的类,要实现抽象类中的抽象方法,即给出具体的实现细节)。生产车间制造出手机,就是实现了类的实例化。

  

//工厂类
public abstract class PhoneFactory{
  public Phone orderPhone(String type){
    Phone phone;
    phone = createPhone(type);
    phone.box();
    return phone;
  }

  protected abstract Phone createPhone(String type);

}

public class XiaomiPhoneFactory extends PhoneFactory{
  Phone createPhone(String item){
    if(item.equals("全面屏")){
      return new XiaomiFullPhone();
    }else if(item.equals("音乐")){
      return new XiaomiMusicPhone();
    }else return null;
  }
}
//华为、诺基亚手机生产车间类似


//产品类
public abstract class Phone{
  String name;
  String color;
  int price;
  void box(){
    System.out.println("将手机打包");
  }
  public String getName(){
    return name;
  }
}

public class XiaomiFullPhone extends Phone{
  public XiaomiFullPhone(){
    name = "小米全面屏手机";
    color = "红色";
    price = 1000;
  }
}

public class XiaomiMusicPhone extends Phone{
  public XiaomiFullPhone(){
    name = "小米拍照手机";
    color = "红色";
    price = 1200;
  }
}

//订购小米全面屏手机
public class PhoneTest{
  public static void main(String[] args){
    PhoneFactory xiaomiPhoneFactory = new XiaomiPhoneFactory();
    Phone phone =  xiaomiPhoneFactory.order("全面屏");
    System.out.println("已经订购了一个"+phone.getName());
  }
}

简单工厂与工厂方法之间的差异:

    简单工厂把全部的事情都在一个地方处理完毕了,而工厂方法是创建一个框架,让子类决定如何实现。简单工厂不具备工厂方法的弹性,简单工厂不能变更正在创建的产品。

工厂的好处:

  将创建对象的代码集中在一个对象或方法中,可以避免代码中的重复,并且更方便以后的维护。这也意味着客户在实例化对象时,只会依赖接口,而不是具体的类。

3、抽象工厂模式

  提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。通过抽象工厂所提供的接口,可以创建产品家族,利用这个接口书写代码,我们的代码将从实际代码中解耦,以便在不同上下文中实现各式各样的工厂,制造出各种不同的产品。因为代码从实际的产品中解耦了,所以我们可以替换不同的工厂来取得不同的行为。

      手机工厂中各个品牌生产车间都会制造不同颜色的手机,为了防止从一个手机工厂中制造出的手机,会因为品牌的不同,颜色显示不同,工厂统一提供颜料。

工厂方法与抽象工厂的区别:

1、工厂方法用的是继承,抽象工厂用的是组合

2、工厂方法是用来创建对象的,整个工厂方法模式,只不过就是通过子类来创建对象。用这种做法,客户只需要知道他们所使用的抽象类型就可以了,而由子类来负责决定具体类型。换句话说就是,工厂方法负责将客户从具体类型中解耦。

     抽象工厂是用来创建一个产品家族的抽象类型,这个类型的子类定义了产品被产生的方法。要想使用这个工厂,必须先实例话它,然后将它传入一些针对抽象类型所写的代码中。

 

posted @ 2018-08-27 14:02  菠菜汤圆  阅读(324)  评论(0编辑  收藏  举报