工厂方法模式

应用最广泛的模式-工厂方法模式

模式简介

创建型设计模式,定义一个用于创建对象的接口,让子类决定实例化哪个类。

使用场景

在任何需要生成复杂对象的地方,都可以使用工厂模式。复杂对象适合使用工厂模式,用new就可以完成创建的对象无需使用工厂模式

简单实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//功能的抽象基类
public abstract class AudiCar {
    //驾驶函数
    public abstract void drive();
    //自动巡航函数
    public abstract void selfNavigation();
}


//生产线类
public class AudiCarFactory extends AudiFactory {
    public <T extends AudiCar> T creatAudiCar(Class<T> tclass) {
        AudiCar audiCar=null;
        try{
            audiCar=(AudiCar) Class.forName(tclass.getName()).newInstance();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (T)audiCar;
    }
}


//工厂抽象类
public abstract class AudiFactory {
    //某车型的工厂方法
    public abstract <T extends AudiCar>T creatAudiCar(Class<T> tclass);
}


//产品类A
public class AudiQ3 extends AudiCar {
    public void drive() {
        System.out.println("Q3发动了!!");
    }

    public void selfNavigation() {
        System.out.println("Q3开始了自动巡航!!");
    }
}


//产品类B
public class AudiQ5 extends AudiCar {
    public void drive() {
        System.out.println("Q5发动了!!");
    }

    public void selfNavigation() {
        System.out.println("Q5开始了自动巡航!!");
    }
}


//演示DEMO类
public class Client {
    public static void main(String[] args) {
        AudiFactory audiFactory=new AudiCarFactory();
        AudiQ3 audiQ3=audiFactory.creatAudiCar(AudiQ3.class);
        audiQ3.drive();
        audiQ3.selfNavigation();
        AudiQ5 audiQ5=audiFactory.creatAudiCar(AudiQ5.class);
        audiQ5.drive();
        audiQ5.selfNavigation();
    }
}

执行结果

1
2
3
4
Q3发动了!!
Q3开始了自动巡航!!
Q5发动了!!
Q5开始了自动巡航!!

缺点

每次为工厂方法模式添加新的产品时就要编写一个新的产品类,同时还要引入抽象层,这必然会导致类结构的复杂化,所以,在情况比较简单的时候可能不适用使用工厂方法模式。需要我们自己去衡量