Java设计模式--工厂方法模式

工厂方法模式

1.工厂方法模式的概述
1.1工厂模式是简单工厂模式的延伸,符合开闭原则的基础上,还可以在增加新的具体产品对象时不需要对已有系统做任何修改。

1.2工厂方法模式:定义一个用于创建对象的接口,但是让子类决定将哪个类实例化,工厂方法模式让一个类的实例化延伸到其子类。(也就是说在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是对于不同的产品提供不同的工厂。例如:宝马工厂生产宝马汽车,奔驰工厂生产奔驰汽车。。。。。)

2.工厂方法模式的结构
2.1模式结构:

在这里插入图片描述

 (1):Product(抽象产品):定义产品的接口,是工厂方法模式所创建对象的超类型,产品对象的公共父类。
(2)具体产品:它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品一一对应。
(3)Factory(抽象工厂):在抽象工厂类中声明了工厂方法,用于返回同一个产品。
(4)具体工厂:抽象工厂的子类,实现了在抽象工厂中声明的工厂方法,并可由客户端调用,返回一个具体产品类的实例。。。

例题:宝马(BMW)工厂制造宝马汽车,奔驰汽车(Benz)工厂制造奔驰汽车。使用工厂方法模式模拟该场景,要求绘制出相应的类图并用Java语言模拟实现。
在这里插入图片描述

(1)Car:充当抽象产品角色

public abstract class Car {
    public abstract void run();//抽象产品方法
}

(2)BMW :充当具体的产品角色

public class BMW extends Car {
    @Override
    public void run() {
        System.out.println("宝马车跑的快...");
    }
}

(3)Benz:充当具体的产品角色

public class Benz extends Car{
    @Override
    public void run() {
        System.out.println("奔驰车跑的块...");
    }
}

(4)CarFactory:充当抽象工厂角色

public abstract class CarFactory {
    public void run(){
        Car car = this.produceCar();//在工厂类中直接调用汽车工厂类得业务方法run()
        car.run();
    }
    public abstract Car produceCar();//抽象工厂方法.
}

(5)BenzFactory:充当具体工厂角色

public class BenzFactory extends CarFactory{
    @Override
    public Car produceCar() {
        Car car = new Benz();//创建奔驰汽车的对象
        return car;
    }
}

(6)BMWFactory:充当具体工厂角色

public class BMWFactory extends CarFactory{
    @Override
    public Car produceCar() {
        Car car = new BMW();//创建宝马汽车的对象
        return car;
    }
}

(7)客户端测试类。

public class Client {
    public static void main(String[] args) {
        CarFactory factory, factory1;
        Car car,car1;
        factory = new BenzFactory();
        factory1 = new BMWFactory();
        car = factory.produceCar();
        car1 = factory1.produceCar();
        car1.run();
        car.run();
    }
}

3.工厂模式的优点:
(1)使用工厂方法来创建用户所需的产品,用户只要关心所需产品对应的工厂,无需关心创建的细节。
(2)所有的具体工厂类都具有同一抽象父类(本例中的CarFactory作为BMWFactory和BenzFactory 的父类)工厂能自行确定创建何种产品对象,而创建的细节完全封装在具体工厂中。
(3)如果新加入产品,就无需修改抽象工厂类和抽象产品类,也无需修改其他具体工厂和产品,而只用添加一个具体工厂和具体产品即可。增加系统的可扩展性,符合开闭原则

4.缺点:
添加新产品会增加具体工厂类和具体产品类,这无疑会增加系统的复杂度,带来更多的开销。。。

总结:当然这题可以使用反射机制并引入配置文件实现。(会更加灵活)具体的实现方式,下次发文详细说明。

最后:希望多多指教,共同进步,与君共勉!!!(争取一周写1-2篇有关Java设计模式的文章,临近期末也当做复习了。。。)

  • 20
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值