设计模式(二)-工厂模式

1、作用:实现了创建者呵调用者的分离。

2、详细分类

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

 

3、OOP七大原则

  • 开闭原则:一个软件的实体应当对扩展开放,对修改关闭
  • 依赖倒转原则:对接口编程,不应该对实现编程
  • 迪米特法则:不要和模式人说话

 

4、核心本质

(1)实例化对象不使用new,用工厂方法代替;

(2)将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦。

 

5、三种模式

  • 简单工厂模式:用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改已有代码)
  • 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
  • 抽象工厂模式:围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂

 

6、简单工厂模式

增加一个新的产品,如果不修改代码,做不到。

代码如下:

1 /**
2  * @author it-小林
3  * @desc 汽车接口
4  * @date 2021年07月05日 21:05
5  */
6 public interface Car {
7 
8     void name();
9 }
/**
 * @author it-小林
 * @desc
 * @date 2021年07月05日 21:06
 */
public class WuLing implements Car{


    @Override
    public void name() {
        System.out.println("五菱宏光神车");
    }
}
 1 /**
 2  * @author it-小林
 3  * @desc
 4  * @date 2021年07月05日 21:24
 5  */
 6 public class Dazhong implements Car{
 7 
 8     @Override
 9     public void name() {
10         System.out.println("大众");
11     }
12 }

 

 

 1 /**
 2  * @author 林瑞涛
 3  * @desc
 4  * @date 2021年07月05日 21:07
 5  */
 6 public class Tesla implements Car {
 7 
 8     @Override
 9     public void name() {
10         System.out.println("特斯拉豪华车!!");
11     }
12 }

 

工厂类的代码:

/**
 * @author it-小林
 * @desc 静态工厂模式
 * @date 2021年07月05日 21:16
 */
public class CarFactory {

    public static Car getCar(String car){
        if(car.equals("五菱")){
            return new WuLing();
        }else if(car.equals("特斯拉")){
            return new Tesla();
        }else if(car.equals("大众")){
            return new Dazhong();
        }else{
            return null;
        }
    }
}

 

调用者:

 1 /**
 2  * @author it-小林
 3  * @desc
 4  * @date 2021年07月05日 21:09
 5  */
 6 public class Consumer {
 7     public static void main(String[] args) {
 8 
 9         /*Car car = new WuLing();
10         Car car2 = new Tesla();*/
11 
12         //2.使用工厂创建
13         Car car = CarFactory.getCar("五菱");
14         Car car2 = CarFactory.getCar("特斯拉");
15 
16         car.name();
17         car2.name();
18     }
19 }

 :大多数情况下用的都是简单工厂模式,这种模式仍有不足,如果再增加一辆车,则会修改CarFactory.java的getCar方法,违反了开闭原则,我们应该扩展,不应该修改。

 

7、工厂方法模式

       我们新建一个CarFactory的接口,然后为每种Car都建一个Factory类。这样就可以使得每次新加入一种车时,只为这种车建立一个对应的工厂就行,不会影响到原来的代码。

 

 

/**
 * @author it-小林
 * @desc
 * @date 2021年07月06日 17:47
 */
public interface CarFactory {
    Car getCar();
}

 

 1 /**
 2  * @author it-小林
 3  * @desc
 4  * @date 2021年07月06日 17:48
 5  */
 6 public class DaZhongFactory implements CarFactory{
 7     @Override
 8     public Car getCar() {
 9         return new Dazhong();
10     }
11 }

 

 1 /**
 2  * @author it-小林
 3  * @desc
 4  * @date 2021年07月06日 17:49
 5  */
 6 public class AbstractFactoryTest {
 7     public static void main(String[] args) {
 8         Car car = new DaZhongFactory().getCar();
 9         car.name();
10     }
11 }

 

 

优点:下次加入一种大众车,只需要新建一个 DazhongFactory 就行,不会影响到别的工厂。

缺点:代码量加大,管理复杂,结构复杂,实际业务一般使用简单工厂模式

 

总结:不一定要符合设计原则,要根据实际情况加以分析取舍。

 

应用场景:

  • JDK中Calendar的getInstance方法;
  • JDBC中的Connection对象的获取;
  • Spring中IOC容器创建管理Bean对象;
  • 反射中Class对象的newInstance方法。
posted @ 2021-07-06 17:54  it-小林  阅读(96)  评论(0编辑  收藏  举报