工厂模式

Posted abking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工厂模式相关的知识,希望对你有一定的参考价值。

工厂模式(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 }

 

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

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

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

所以

以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式学习——简单工厂模式工厂模式抽象工厂模式

设计模式工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

设计模式-简单工厂工厂方法模式抽象工厂模式详解

C++工厂模式(简单工厂工厂方法抽象工厂)