码迷,mamicode.com
首页 > 其他好文 > 详细

工厂模式

时间:2020-02-07 16:32:46      阅读:71      评论:0      收藏:0      [点我收藏+]

标签:unit   sim   ccache   pre   print   奔驰   设计模式   equal   逻辑   

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

工厂模式分为:

  • 简单工厂模式
  • 工厂模式
  • 工厂模式

简单工厂模式:

首先常见一个Car接口,接口中定义一个run()方法:

1 package top.bigking.factory.simpleFactory;
2 
3 /**
4  * @Author ABKing
5  * @Date 2020/2/7 下午3:43
6  **/
7 public interface Car {
8     public void run();
9 }

再写两个类实现这个Car接口

 1 package top.bigking.factory.simpleFactory;
 2 
 3 /**
 4  * @Author ABKing
 5  * @Date 2020/2/7 下午3:44
 6  **/
 7 public class Benchi implements Car {
 8     @Override
 9     public void run() {
10         System.out.println("奔驰");
11     }
12 }
 1 package top.bigking.factory.simpleFactory;
 2 
 3 /**
 4  * @Author ABKing
 5  * @Date 2020/2/7 下午3:44
 6  **/
 7 public class Byd implements Car {
 8     @Override
 9     public void run() {
10         System.out.println("比亚迪");
11     }
12 }

测试如下:

 1 /**
 2  * @Author ABKing
 3  * @Date 2020/2/7 下午3:45
 4  **/
 5 public class TestSimpleFactory {
 6     @Test
 7     public void testNoFactory(){
 8         Car car1 = new Benchi();
 9         Car car2 = new Byd();
10         car1.run();
11         car2.run();
12 
13 
14     }
15 }

很明显我们可以看到,作为用户来讲,必须知道接口,还要知道实现类。

而我们不希望用户知道这么多,我们需要隐藏这些,由此,我们引入了简单工厂模式:

新建一个工厂类:

 1 package top.bigking.factory.simpleFactory;
 2 
 3 /**
 4  * @Author ABKing
 5  * @Date 2020/2/7 下午3:48
 6  **/
 7 public class CarFactory {
 8     public Car getCar(String carName){
 9         if(carName.equals("奔驰")){
10             return new Benchi();
11         }
12         else if(carName.equals("比亚迪")){
13             return new Byd();
14         }
15         return null;
16     }
17 }

进行测试:

 1 package top.bigking.factory.simpleFactory;
 2 
 3 import org.junit.Test;
 4 import sun.security.krb5.internal.ccache.CCacheInputStream;
 5 
 6 /**
 7  * @Author ABKing
 8  * @Date 2020/2/7 下午3:45
 9  **/
10 public class TestSimpleFactory {
11     @Test
12     public void testNoFactory(){
13         Car car1 = new Benchi();
14         Car car2 = new Byd();
15         car1.run();
16         car2.run();
17     }
18     @Test
19     public void testCarFactory(){
20         CarFactory carFactory = new CarFactory();
21         Car car1 = carFactory.getCar("比亚迪");
22         Car car2 = carFactory.getCar("奔驰");
23         car1.run();
24         car2.run();
25     }
26 }

 

这样用户就不必知道具体的实现了,只需要知道相应的接口即可。

但是我们应该注意的是:如果我们需要增加新的车,比如兰博基尼,我们就需要添加一个新的类,并且在修改工厂类

这显然违反了 开闭原则(对扩展开放,对修改关闭)。

所以

工厂模式

标签:unit   sim   ccache   pre   print   奔驰   设计模式   equal   逻辑   

原文地址:https://www.cnblogs.com/ABKing/p/12273383.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!