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,这样,封装性更好,同时扩展性也大大增强,更加安全!

原文地址:https://www.cnblogs.com/yemaozistar/p/4137521.html