下面我们来看一个场景:
假如客户需要一辆卡车(car),有的客户需要一辆挖土机(navvy),则我们可以抓住他们的共性,可以run
可以定义一个Moveable接口
1 public interface Moveable { 2 void run(); 3 }
1 public class Car implements Moveable{ 2 3 /*//自己实例化一个静态的Car对象 由于只能产生一个所以也叫单例 4 private static Car car=new Car(); 5 6 public static Car getInstance(){ 7 return car; 8 } 9 */ 10 11 public void run(){ 12 System.out.println("老司机开车了.....快上车没时间解释了....."); 13 } 14 }
package com.hone.design.singleton; public class navvy implements Moveable { @Override public void run() { System.out.println("快来挖掘机学校吧。。。。。"); } }
定义一个client类,用于实现客户自己的想法:
1 public class Client { 2 public static void main(String[] args) { 3 4 5 /* 6 * 这里面无论再加上什么东西只需要new一个新的对象即可, 7 */ 8 Moveable moveable=new car(); 9 moveable.run(); 10 } 11 } 12
如果每次客户需要一辆车,都得自己去制作一辆新的,效率会有多么低啊?因此我们就出现了工厂的概念,能不能每一个工厂都将car navvy制作好了之后,客户需要了可以自己去拿呢?
当然是可以额。
1 public class CarFactory { 2 // Car工厂 这里有一个createCar()方法,将制作好的car对象返回回来 3 4 public Moveable createCar(){ 5 return new Car(); 6 }
1 public class NavvyFactory extends VehicleFactory{ 2 3 public Moveable createPlane(){ 4 return new Plane(); 5 } 6 }
client类
1 public class Client { 2 public static void main(String[] args) { 3 4 5 6 /* 7 * 这里先利用工厂生产车的对象,然后在调用车对象的run方法 8 */ 9 CarFactory factory=new CarFactory(); 10 Moveable car=factory.createCar(); 11 car.run();
这里面factory有太多相同的方法,我们在抽象一下,可以不可以将factory定义为一个接口或者一个抽象类呢,让carFactory和NavvyFactory从Factory工厂中继承或者实现呢?
1 public abstract class VehicleFactory { 2 //这里的返回值当然是一个Moveable接口的对象 3 public abstract Moveable create(); 4 5 }
1 public class CarFactory extends VehicleFactory{ 2 3 @Override 4 public Moveable create() { 5 return new Car(); 6 } 8 }
1 public class NavvyFactory extends VehicleFactory{ 2 3 @Override 4 public Moveable create() { 5 return new navvy(); 6 } 7 }
client的实现:
public class Test { public static void main(String[] args) { //加入我们将工厂对象抽象出来,不必每次都new一个新的工厂对象出来 VehicleFactory factory=new NavvyFactory(); Moveable plane=factory.create(); plane.run(); } }
所以我们可以知道简单工厂是什么东西?
也就是当我们需要很多有共性的对象的时候,我们可以定义一个抽象的类或者接口,让其他具体的类从里面实现。
工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。 可以减少代码的冗余。
1 <html> 2 <body> 3 <a href="http://www.cnblogs.com/xiaxj/p/6497564.html">下篇文章,什么是静态代理?</a> 4 </body> 5 </html>