23种设计模式----------工厂模式.
女娲造人故事开头(借由设计模式之禅):
第一次烤泥人,感觉应该熟了,往大地一放,哇,没烤熟!于是白人诞生了!(这也是缺乏经验的最好证明)
第二次烤泥人,上一次没烤熟,这一次多烤一会,放到世间一看,嘿,烤过头了,于是黑人诞生了!
第三次烤泥人,一边烤一边察看,直到表皮嫩黄,嘿,真正好,于是黄色人种出现了!
言归正传,所谓的工厂模式,要从工厂说起,工厂就是制造生产东西的,所以,也很容易知道工厂模式就是,利用工厂生产对象。所以,工厂模式,要有工厂和需要生产的产品。
工厂模式的好处就在于,不需要知道对象是怎么产生的,只需要通过工厂我们可以根据不同的要求得到对应的对象。这样,既体现了封装,也表现了堕胎性。
由于需要生产具体的东西并不是很确定,所以产品一般都会是抽象类。
抽象产品代码:
//总球类 public abstract class Ball { public void fun1(){ } public abstract void fun2(); }
然后,只需让具体的产品集成该抽象类(所以一个工厂基本是生产一类产品)。
//足球 public class Football extends Ball { public void fun2() { } } //篮球 public class Basketball extends Ball { public void fun2() { } }
抽象工厂类定义产品生产方法:
1 //抽象工厂 2 public abstract class Factory { 3 4 public abstract <T extends Ball> T createBall(Class<T> c); 5 6 }
是生产哪种具体球,具体的工厂类实现来确定。
1 public class BallFactory extends Factory { 2 @Override 3 public <T extends Ball> T createBall(Class<T> c) { 4 Ball ball = null; 5 try { 6 ball = (Ball) Class.forName(c.getName()).newInstance(); 7 } catch (Exception e) { 8 e.printStackTrace(); 9 } 10 11 return (T) ball; 12 } 13 }
具体生产出的球类:
1 public class Client { 2 public static void main(String[] args) { 3 Factory factory = new BallFactory(); 4 //通过工厂生产出的足球类! 5 Ball footBall = factory.createBall(Football.class); 6 } 7 }
这种简单的工厂模式,就设计好了。!
单例工厂模式:
1 //单例类 2 public class Singleton { 3 private Singleton(){ 4 5 } 6 } 7 8 //单例工厂 9 public class SingletonFactory { 10 private static Singleton single; 11 //生成实力 12 static{ 13 try { 14 Class<?> clazz = Class.forName(Singleton.class.getName()); 15 Constructor<?> constructor = clazz.getDeclaredConstructor(); 16 constructor.setAccessible(true); 17 single = (Singleton) constructor.newInstance(); 18 } catch (Exception e) { 19 e.printStackTrace(); 20 } 21 } 22 //获取示例的方法 23 public static Singleton getInstance(){ 24 return single; 25 } 26 }
在项目中,其实我们就有用到很多工厂模式,比如spring中的BeanFactory,我们通过spring容器帮我们创建我们所需要的实例对象,并不需要知道创建过程,并且维护该对象的生命周期也是通过spring,这样,封装性更好,同时扩展性也大大增强,更加安全!