天天看点

GOF23设计模式之简单工厂的实现

package com.bjsxt.cn.simplefactory;      
public interface Car {
 void run();
}      
package com.bjsxt.cn.simplefactory;      
public class Audi implements Car{      
 @Override
 public void run() {
  System.out.println("奥迪在跑");
  
 }      
}
      
package com.bjsxt.cn.simplefactory;      
public class Byd implements Car {      
 @Override
 public void run() {
  System.out.println("比亚迪在跑");
  
 }
 
}
      
package com.bjsxt.cn.simplefactory;      
public class Benchi implements Car {      
 @Override
 public void run() {
  System.out.println("奔驰在跑");      
 }      
}
      
package com.bjsxt.cn.simplefactory;
/*
 * 这是一种简单工厂模式的实现。
 * 我作为调用者不需要知道具体的实现类,只需要知道我所需要的车的类型是奥迪或者比亚迪就可以了。而不需要知道具体的创建这两种车的
 * 具体手段(new Audi()或者new Byd()),这也就说明了调用者和创建的分离的核心思想
 * 
 * 倘若我们要增加一个新的类型,我们通过下面的手段可以实现这样的目的:
 *  1, 增加新的实现Car接口的类,比如benchi类(奔驰车)
 *  2, 在CarFactory类中else部分增加类型判断是否为奔驰,创建相应的车型车。
 *  3, 但是这样做的后果就是已经违背了OCP原则,开闭原则,就是我们要不修改已有代码的基础上,扩展代码(通过增加类实现)。但是
 *   显然,我们需要修改CarFactory中的代码语句。
 *  
 *  相对于不使用工厂模式的方法来说,整体来说类的结构变得复杂,但是对于调用者(client)来说,变得简单了。
 *  简单工厂模式也叫静态工厂模式,就是工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
 * */
public class CarFactory {
 public static Car createCar(String type) {
  if (type.equals("奥迪")) {
   return new Audi();
  } else if (type.equals("比亚迪")) {
   return new Byd();
  } else {
   
   return null;
  }
  
 }
}
      
/**
 * 时间:2015年3月29日10:05:41
 * 源程序作用:简单工厂模式的另外一种实现方式
 * 
 * 这是简单工厂模式工厂类的第二种实现方式
 * 通过在简单工厂中创建相应每一个类的对应的创建方法来实现
 * 若要增加一种新的车辆类型,需要在包内创建相应的车辆类(这并没有违反OCP,因为只是增加了类,并没有修改已有类)和在工厂类中增加相应的创建该车辆类型的方法。
 * 在工厂类中(CarFactory2)中增加新的创建相应类型的方法违背了开闭原则。
 * 
 * 简单工厂模式又称为静态工厂模式就是因为在工厂类中具有很多的静态方法,如该程序所示。
 */      
package com.bjsxt.cn.simplefactory;      
public class CarFactory2 {
 public static Car createAudi() {
  return new Audi();
 }
 
 public static Car createByd() {
  return new Byd();
 }
 
 public static Car CreateBenchi() {
  return new Benchi();
 }
}
      
/*
 * 时间:2015年3月29日10:00:02
 * 测试简单工厂模式
 * 这是调用者Client。
 * 在本测试程序中,我们需要知道CarFactory,和你所要创建的车的类型。先要有一个工厂。
 * */
package com.bjsxt.cn.simplefactory;      
public class Client {
 public static void main(String[] args) {
  Car c1 = new CarFactory().createCar("奥迪");
  c1.run();
  
  new CarFactory().createCar("比亚迪").run();
 }
}

      

继续阅读