工厂模式
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 }
这样用户就不必知道具体的实现了,只需要知道相应的接口即可。
但是我们应该注意的是:如果我们需要增加新的车,比如兰博基尼,我们就需要添加一个新的类,并且在修改工厂类
这显然违反了 开闭原则(对扩展开放,对修改关闭)。
所以
以上是关于工厂模式的主要内容,如果未能解决你的问题,请参考以下文章
设计模式简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )