工厂模式(Factory Pattern)

2024/3/27 Java进阶

将创建对象的事交给工厂,不用自己new对象,需要对象从工厂里面拿。

# 1、简单工厂

public interface ICar {
    String getCarName();
}

public class WulingCar implements ICar {
    @Override
    public String getCarName() {
        return "五菱车型";
    }
}

public class YeMaCar implements ICar {
    @Override
    public String getCarName() {
        return "野马车型";
    }
}



public class CarFactory {
    /**
     * 根据不同车名称创建不同的车
     */
    public static ICar createCar(String carName){
        if("五菱".equals(carName))
            return new WulingCar();
        else if("野马".equals(carName))
            return new YeMaCar();
        else
            return null;
    }
}


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
public class ClientTest {

    public static void main(String[] args) {
        ICar car = CarFactory.createCar("五菱");
        if(car==null){
            return;
        }
        System.out.println(car.getCarName());
    }
}
// 输出结果:五菱车型
1
2
3
4
5
6
7
8
9
10
11

# 2、工厂方法

工厂方法把实例化操作推迟到子类

// 工厂不直接实现,给子类实现,其实就是定义一个标准
public interface  CarFactory {
    ICar createCar();
}
1
2
3
4
public class WulingCarFactory implements CarFactory {
    @Override
    public ICar createCar() {
        return new WulingCar();
    }
}

public class YeMaCarFactory implements CarFactory {
    @Override
    public ICar createCar() {
        return new YeMaCar();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class ClientTest {
    public static void main(String[] args) {
        /**
         * 通过各自的工厂去创建各自的车,创建车的事交个工厂
         * 新增加一个车时,不需要动原来的代码,新增类型车继承车进行组装,再创建相应的工厂创建该车即可
         */
        CarFactory factory1 = new WulingCarFactory();
        ICar car1 = factory1.createCar();
        System.out.println(car1.getCarName());

        CarFactory factory2 = new YeMaCarFactory();
        ICar car2 = factory2.createCar();
        System.out.println(car2.getCarName());
    }
}
/**
 * 输出结果:
 * 五菱车型
 * 野马车型
 **/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 3、抽象工厂

工厂方法和抽象工厂的区别:

  • 工厂方法模式:工厂方法模式只是用于创建一个对象。
  • 抽象工厂模式:抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象。
// 定义一个工厂标准,这个标准为工厂能生产手机和wifi发射器
public interface IFactory {
    IPhone createPhoneProduct();

    IWifi createWifiProduct();
}

1
2
3
4
5
6
7
// 小米就建这种工厂,生产小米的手机和wifi发射器
public class XiaoMiFactory implements IFactory{
    @Override
    public IPhone createPhoneProduct() {
        return new XiaoMiPhone();
    }

    @Override
    public IWifi createWifiProduct() {
        return new XiaoMiWifi();
    }
}

// 华为也建这种工厂,生产华为的手机和wifi发射器
public class HuaWeiFactory implements IFactory{
    @Override
    public IPhone createPhoneProduct() {
        return new HuaWeiPhone();
    }

    @Override
    public IWifi createWifiProduct() {
        return new HuaWeiWifi();
    }
}
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
// 任意一个工厂实现,都会有手机和wifi发射器
public class ClientTest {
    public static void main(String[] args) {
        XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
        IPhone phoneProduct = xiaoMiFactory.createPhoneProduct();
        phoneProduct.callPhone();

        IWifi wifiProduct = xiaoMiFactory.createWifiProduct();
        wifiProduct.openWifi();
    }
}
/**
 * 输出结果:
 * 小米打电话
 * 小米开wifi
 **/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

补充:对于手机和wifi产品而言,也算是一个抽象工厂模式,定义标准,不同的产品去实现功能,一对多。

public interface IPhone {
    // 打电话
    void callPhone();
    // 发送短信
    void sendMsg();
}
1
2
3
4
5
6
public interface IWifi {
    // 开启wifi
    void openWifi();
    // 关闭wifi
    void closeWifi();
}
1
2
3
4
5
6
public class XiaoMiPhone implements IPhone{
    @Override
    public void callPhone() {
        System.out.println("小米打电话");
    }

    @Override
    public void sendMsg() {
        System.out.println("小米发短信");
    }
}

public class XiaoMiWifi implements IWifi {
    @Override
    public void openWifi() {
        System.out.println("小米开wifi");
    }

    @Override
    public void closeWifi() {
        System.out.println("小米关wifi");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class HuaWeiPhone implements IPhone{

    @Override
    public void callPhone() {
        System.out.println("华为打电话");
    }

    @Override
    public void sendMsg() {
        System.out.println("华为发短信");
    }
}

public class HuaWeiWifi implements IWifi{
    @Override
    public void openWifi() {
        System.out.println("华为开wifi");
    }

    @Override
    public void closeWifi() {
        System.out.println("华为关wifi");
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24