JAVA工厂方法模式

1.工厂方法模式概念

工厂方法模式(Factory Method) : 定义一个用于创建对象的接口,让子类决定实例化了哪个类。工厂方法使一个类的实例化延迟到其子类。 用于生产同一等级结构中的固定产品。(支持增加任意产品)

特点:(1)工厂方法模式是简单工厂模式的进一步抽象和推广 。

           (2) 使用了多态性,工厂方法模式保持了简单工厂模式的优点,克服了它缺点。 

      又叫多态性工厂模式(Polymorpic Factory Pattern),它由四种角色组成(关系见下面的类图):

     1、抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
     2、具体工厂(Concrete Creator)角色:该角色实现了抽象工厂接口,含有与应用相关的逻辑,并且受到应用程序的调用,以创建产品对象。 
     3、抽象产品(Product)角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。                                          4、具体产品(Concrete Product)角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

     还是上次那个例子(上一篇JAVA简单工厂模式),奥迪和比亚迪的跑法。哈哈,比亚迪可以逆天么?

2.  UML图。

  

3. 具体代码

   (1)抽象工厂

 
  1. public interface CarFactory{

  2. public Car CreateCar();

  3. //更多其他逻辑.....

  4. }

    (2)具体工厂

       奥迪工厂:实现CarFactory接口,是一个用于生产 奥迪的具体工厂

 
  1. public class AudiFactory implements CarFactory {

  2. //创建者

  3. @Override

  4. public Car CreateCar() {

  5. return new AuDi();//返回奥迪给ClientFactoryMethod

  6. //更多逻辑

  7. }

  8. }

      比亚迪工厂:实现CarFactory接口,是一个用于生产比亚迪的具体工厂

 
  1. public class BYDFactory implements CarFactory {

  2. //创建者

  3. @Override

  4. public Car CreateCar() {

  5. return new BYD();//返回比亚迪给ClientFactoryMethod

  6. //更多逻辑

  7. }

  8. }

   (3)抽象产品

 
  1. <span style="font-weight: normal;"> //抽象产品角色

  2. public interface Car {

  3. public void run(); //更多具体逻辑.......

  4. } </span>

        (4)具体产品

         奥迪产品: 实现Car接口,是一个具体的产品

 
  1. //具体产品奥迪 </span>

  2. public class AuDi implements Car{

  3. @Override

  4. public void run() {

  5. System.out.println("奥迪跑起来了");

  6. } //更多具体逻辑......

  7. }

        比亚迪产品: 实现Car接口,是一个具体的产品

 
  1. //具体产品比亚迪 public class BYD implements Car{

  2. @Override

  3. public void run() {

  4. System.out.println("比亚迪跑起来了"); }

  5. }

      测试:

 
  1. //工厂方法模式

  2. public class ClientFactoryMethod {//客户端

  3. //调用者

  4. public static void main(String[] args) {

  5. Car audi=new AudiFactory().CreateCar();//通过具体的工厂创建产品

  6. Car byd=new BYDFactory().CreateCar();

  7. //车跑

  8. audi.run();

  9. byd.run();

  10. }

  11. }

4.小结

工厂方法模式的优点:

1.良好的封装性,代码结构清晰。创建产品时只要知道这个产品的类名或约束字符串就可以,不用知道创建的过程,降低了板块间的耦合。

2.优秀的可拓展性。 在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以适应变化。 如要新增加奔驰benz,只要新建一个奔驰产品: 实现Car接口奔驰工厂:实现CarFactory接口,就行了。

3.屏蔽产品类,产品类如何实现如何变化,调用者不用关心,只需关心产品的接口,只要接口保持不变,系统的上层模版就不会发生变化。

4.工厂方法模式是典型的解耦框架,符合迪米特法则,也符合依赖倒置原则,还符合里氏替换原则。

迪米特法则:又叫作最少知识原则(Least Knowledge Principle 简写LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。

依赖倒置原则:A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

里氏替换原则:OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。“抽象”是语言提供的功能。“多态”由继承语义实现。
工厂模式在项目中使用的非常频繁,在很多框架的代码中都可以发现它的应用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值