gpt4 book ai didi

java设计模式之工厂方法模式

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章java设计模式之工厂方法模式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

概要 。

设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美.

定义 。

定义一个用于创建对象的接口,让其子类去决定实例化那个类 。

使用场景 。

任何使用复杂对象的地方,都可以使用工厂模式 。

UML 。

java设计模式之工厂方法模式

1.抽象工厂 。

 抽象工厂:我们都知道,工厂,一般只有一个作用,那就生产,比如,吉利汽车厂,那就制造吉利汽车,iphone手机制造厂就造iphone等等 所以可以用一个简单的方法概括,就是create(); 2.具体汽车制造厂 。

 具体汽车制造厂:实现了抽象工厂,具有实际的制造汽车的流程和方法等 。

3.抽象汽车 。

 抽象汽车:汽车我们一般都知道,能跑,能放音乐,能导航,能转弯这些都是汽车的共性 。

4.具体汽车 。

 抽象汽车:具体汽车实现了抽象汽车,具备其所有的功能,当然不同的汽车可能具备的功能还不一样 。

上述简单的做了介绍,大体而言就是,具体汽车厂制造相应的的汽车,比如:奥迪的工厂,制造奥迪汽车,大众的工厂,制造大众的汽车等 。

代码演示 。

上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:

(1)抽象汽车工厂 。

?
1
2
3
4
5
6
7
8
9
10
package com.zengtao.demo.factory;
 
/**
  * 抽象工厂
  */
public abstract class CarFactory {
 
   public abstract <T extends Car> T createCar(Class<T> cla);
 
}

(2)具体汽车工厂 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.zengtao.demo.factory;
 
/**
  * 奥迪工厂
  */
public class AudiFactory extends CarFactory {
 
   @SuppressWarnings ( "unchecked" )
   @Override
   public <T extends Car> T createCar(Class<T> cla) {
     Car car = null ;
     try {
       car = (Car) Class.forName(cla.getName()).newInstance();
     } catch (Exception e) {
       e.printStackTrace();
     }
     return (T) car;
   }
 
}

(3)定义抽象的车 。

?
1
2
3
4
5
6
7
8
9
10
11
package com.zengtao.demo.factory;
 
public abstract class Car {
 
   public abstract void drive();
 
   public abstract void selfNagive();
 
   public abstract void playMusic();
 
}

(4)具体的车 。

(奥迪q3) 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.zengtao.demo.factory;
 
public class AudiQ3Car extends AudiCar {
 
   @Override
   public void drive() {
     System.out.println( "AudiQ3Car 已经制造成功" );
     System.out.println( "AudiQ3Car drive" );
   }
 
   @Override
   public void selfNagive() {
     System.out.println( "AudiQ3Car selfNagive" );
   }
 
   @Override
   public void playMusic() {
     System.out.println( "AudiQ3Car playMusic" );
     System.out.println( "" );
   }
}

(奥迪q5) 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.zengtao.demo.factory;
 
public class AudiQ5Car extends AudiCar {
 
   @Override
   public void drive() {
     System.out.println( "AudiQ5Car 已经制造成功" );
     System.out.println( "AudiQ5Car drive" );
   }
 
   @Override
   public void selfNagive() {
     System.out.println( "AudiQ5Car selfNagive" );
   }
 
   @Override
   public void playMusic() {
     System.out.println( "AudiQ5Car playMusic" );
     System.out.println( "" );
   }
 
}

(5)调用 。

  。

?
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
package com.zengtao.demo;
 
import com.zengtao.demo.factory.AudiFactory;
import com.zengtao.demo.factory.AudiQ3Car;
import com.zengtao.demo.factory.AudiQ5Car;
 
public class Main {
 
   public static void main(String[] str) {
 
     // 创建工厂
     AudiFactory audiFactory = new AudiFactory();
 
     // 利用工厂制造q3车
     AudiQ3Car audiQ3Car = audiFactory.createCar(AudiQ3Car. class );
      // 利用工厂制造q5车
     AudiQ5Car audiQ5Car = audiFactory.createCar(AudiQ5Car. class );
 
     // 开始开车放音乐
     audiQ3Car.drive();
     audiQ3Car.playMusic();
 
     audiQ5Car.drive();
     audiQ5Car.playMusic();
 
   }
}

(6)结果 。

java设计模式之工厂方法模式

以上呢,就里用工厂方法模式,实现了制造汽车的简单过程 。

第一点:

 在抽象工厂中我们看到,createCar(Class cla)方法,我们为什么这样定义呢,使用反射去的方式去创建具体的车,这样,我们不同类型的车,只需要相应的条件,是不是都能产出了,所以这样写是有好处的,就像很多,奥迪有q3,q5,a4,a6,a7,a8等系列一样 。

第二点:

 如果我们有其它的车,比如宝马,也具有宝马x1,320,x5等,我们也可以很简单的实现,只需要实现抽象工厂,然后具体汽车实现抽象car就好了,扩展也非常方便 。

总结 。

抽象工厂到这里也就差不多了,工厂方法模式是一个比较简单也挺好的一种设计模式 。

但是也有缺点,比如:如果有新的其它类型汽车,只需要实现抽象工厂和抽象汽车,也就新建两个类 。

但是如果不是汽车,是手机,那么,就要全部都写一遍,这样就会造成,非常多的类出现,是否采用工厂方法模式,还是根据需求来决定.

注意:大家也不要为了设计而去套用设计模式,当然工厂方法模式平时也很常用,比如:Activity的onCreate方法,我们也是根据自己定义的xml布局,加载生成相应的界面等等 。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:http://blog.csdn.net/u011546655/article/details/52384885 。

最后此篇关于java设计模式之工厂方法模式的文章就讲到这里了,如果你想了解更多关于java设计模式之工厂方法模式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com