文章目录
前言
工厂模式分为:普通工厂模式、工厂方法模式、抽象工厂方法模式。
一、普通工厂模式
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、输出结果
用华为手机打电话
用苹果电脑上网