java三种工厂模式


前言

工厂模式分为:普通工厂模式、工厂方法模式、抽象工厂方法模式。

一、普通工厂模式

1.简单工厂模式结构图如下:

在这里插入图片描述

2.简单工厂模式代码示例

1、车接口

public interface Car {
    //启动
    public void start();
    //跑
    public void run();
    //停车
    public void stop();
}

2、tesla类

public class Tesla implements Car {
    @Override
    public void start() {
        System.out.println("启动特斯拉汽车");
    }

    @Override
    public void run() {
        System.out.println("特斯拉汽车跑起来");
    }

    @Override
    public void stop() {
        System.out.println("特斯拉汽车靠边停车");
    }
}

3、BuildYourDream类

public class BuildYourDream implements Car {
    @Override
    public void start() {
        System.out.println("启动比亚迪汽车");
    }

    @Override
    public void run() {
        System.out.println("比亚迪汽车跑起来了");
    }

    @Override
    public void stop() {
        System.out.println("比亚迪汽车靠边停车");
    }
}

4、车工厂

public class CarFactory {
    public Car getCar(String carType){
        if ("Tesla".equals(carType)) {
            return new Tesla();
        } else if ("BuildYourDream".equals(carType)) {
            return new BuildYourDream();
        } else {
            return null;
        }
    }
}

5、测试类

public class SimpleFactoryTest {
    public static void main(String[] args) {
        CarFactory carFactory = new CarFactory();
        Car tesla = carFactory.getCar("Tesla");
        tesla.start();
        Car buildYourDream = carFactory.getCar("BuildYourDream");
        buildYourDream.run();
    }
}

6、输出结果

启动特斯拉汽车
比亚迪汽车跑起来了

PS:简单工厂方法模式通常不这么用。字符串传入容易出错。可以采用如下两种方式更好。
把工厂类改成多个方法,指定方法只获取对应的实例,此方法需要new一个工厂类。代码如下:

public class CarFactory {    
    public Car getTesla() {
        return new Tesla();
    }
    
    public Car getBYD() {
        return new BuildYourDream();
    }
}
//测试类
public class SimpleFactoryTest {
    public static void main(String[] args) {        
        CarFactory carFactory = new CarFactory();  
        Car tesla = carFactory.getTesla();
        tesla.start();
        Car buildYourDream = carFactory.getBYD();
        buildYourDream.run();
    }
}

把工厂类的方法改成静态方法,指定方法获取对应的实例,此方法好处是不用new 工厂类。代码如下:

 public class CarFactory {  
    public static Car getTesla() {
        return new Tesla();
    }

    public static Car getBYD() {
        return new BuildYourDream();
    }
}
//测试类
public class SimpleFactoryTest {
    public static void main(String[] args) {    
        Car tesla = CarFactory.getTesla();
        tesla.start();
        Car buildYourDream = CarFactory.getBYD();
        buildYourDream.run();
    }
}

二、工厂方法模式

工厂方法模式:对每一种产品提供一个工厂类 。通过不同的工厂实例来创建不同的产品实例。工厂方法模式满足开放封闭原则,在扩展新的类,可以不修改原有类的代码。

1.工厂方法模式结构图如下

在这里插入图片描述

2.工厂方法模式代码示例

1、车接口

//车接口
public interface Car {
    //启动
    public void start();
    //跑
    public void run();
    //停车
    public void stop();
}

//tesla类
public class Tesla implements Car {
    @Override
    public void start() {
        System.out.println("启动特斯拉汽车");
    }

    @Override
    public void run() {
        System.out.println("特斯拉汽车跑起来");
    }

    @Override
    public void stop() {
        System.out.println("特斯拉汽车靠边停车");
    }
}

//BuildYourDream类
public class BuildYourDream implements Car {
    @Override
    public void start() {
        System.out.println("启动比亚迪汽车");
    }

    @Override
    public void run() {
        System.out.println("比亚迪汽车跑起来了");
    }

    @Override
    public void stop() {
        System.out.println("比亚迪汽车靠边停车");
    }
}

2、创建工厂接口,Tesla工厂类,BuildYourDream工厂类

//工厂接口
public interface CarFactory {
    public Car getCar();
}

//tesla工厂类
public class TeslaFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

//比亚迪工厂类
public class BuildYourDreamFactory implements CarFactory {
    @Override
    public Car getCar() {
        return new BuildYourDream();
    }
}

3、测试类

public class MethodFactoryTest {
    public static void main(String[] args) {
        CarFactory teslaFactory = new TeslaFactory();
        Car tesla = teslaFactory.getCar();
        tesla.run();

        CarFactory bydFactory = new BuildYourDreamFactory();
        Car buildYourDream = bydFactory.getCar();
        buildYourDream.stop();
    }
}

4、输出

特斯拉汽车跑起来
比亚迪汽车靠边停车

如果需要扩展,只需增加一个类型的车类以及相应的车工厂类就行,不用修改原有的类。

三.抽象工厂模式

1.抽象工厂模式结构图如下

在这里插入图片描述

2.抽象工厂模式代码示例

1、创建手机产品抽象接口及其实现类

//手机抽象接口
public interface CeilPhone {
    //打电话
    public void Call();
}
//华为手机
public class HuaWeiCeilPhone implements CeilPhone {
    @Override
    public void Call() {
        System.out.println("用华为手机打电话");
    }
}
//苹果手机
public class IPhoneCeilPhone implements CeilPhone {
    @Override
    public void Call() {
        System.out.println("用苹果手机打电话");
    }
}

2、创建电脑产品抽象接口及其实现类

//电脑抽象接口
public interface Computer {
    //上网
    public void surfTheInternet();
}
//华为电脑
public class HuaWeiComputer implements Computer {
    @Override
    public void surfTheInternet() {
        System.out.println("用华为电脑上网");
    }
}
//苹果电脑
public class AppleComputer implements Computer {
    @Override
    public void surfTheInternet() {
        System.out.println("用苹果电脑上网");
    }
}

3、创建抽象工厂接口及相应的工厂类

//电子产品抽象工厂接口,生产上面两种产品
public interface ElectronicProductFactory {
    //生产手机
    public CeilPhone produceCeilPhone();
    //生产电脑
    public Computer produceComputer();
}
//华为电子产品工厂
public class HuaWeiFactory implements ElectronicProductFactory {
    @Override
    public CeilPhone produceCeilPhone() {
        return new HuaWeiCeilPhone();
    }

    @Override
    public Computer produceComputer() {
        return new HuaWeiComputer();
    }
}
//苹果电子产品工厂
public class AppleFactory implements ElectronicProductFactory {
    @Override
    public CeilPhone produceCeilPhone() {
        return new IPhoneCeilPhone();
    }

    @Override
    public Computer produceComputer() {
        return new AppleComputer();
    }
}

4、测试类

public class AbstractFactoryTest {
    public static void main(String[] args) {
    	//华为工厂生产华为产品
        ElectronicProductFactory huaweiFactory = new HuaWeiFactory();
        CeilPhone huaweiCeilPhone = huaweiFactory.produceCeilPhone();
        huaweiCeilPhone.Call();
		//苹果工厂生产苹果产品
        ElectronicProductFactory appleFactory = new AppleFactory();
        Computer appleComputer = appleFactory.produceComputer();
        appleComputer.surfTheInternet();
    }
}

5、输出结果

用华为手机打电话
用苹果电脑上网
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值