设计模式--简单工厂

一、简单工厂模式

工厂模式主要的目的是实现 创建者和调用者的分类


1.1 核心本质

  • 实例化对象,用工厂方法代替new操作
  • 选择实现类、创建对象统一管理和控制。从而使调用者跟实现类解耦

1.2 工厂模式的分类

分类 描述
简单工厂模式 用来生产同一等级结构中的任意产品,对于增加新的产品,需要修改代码
工厂方法模式 用来生产同一等级结构中的固定产品。支持增加任意产品
抽象工厂模式 用来生产不同产品族的全部产品。对于增加新的产品,无能为力,支持增加产品族

1.3 面向对象设计的一些基本原则

原则 描述
OCP开闭原则,Open-Closed Principle) 一个软件的实体应对对扩展开放,对修改关闭
DIP(依赖倒转原则,Dependence Inversion Principle) 针对接口编程,不要针对实现编程
LoD(迪米特法则,Law of Demeter) 只与你直接的朋友通信,而避免和陌生人通信

1.3 简单工厂模式

简单工厂模式也叫做静态工厂模式,就是一个工厂类一般是使用静态方法, 通过接受不同的参数返回不同的实例对象
对于新增加的产品,需要修改代码,所以是扩展是要修改已有的代码,当然违背了关闭原则


1.4 代码示例

案例描述:通过工厂方法来生成汽车。

//定义接口
public interface Car {  
    public void run();

}

//接口的一个实现类
public class Byd implements Car {

    @Override
    public void run() {

        System.out.println("Byd的车在running");
    }  
}

//接口的一个实现类
public class Audi implements Car{

    public void run() {
        System.out.println("Audi的车在running");
    }
}

//简单工厂/ 静态工厂模式
public class CarFactory {
    public static Car createCar(String car){  //  设置成为静态的。这样不依靠对象,而是通过类直接调用
        if("奥迪".equals(car)){
            return new Audi();          

        }else if ("比亚迪".equals(car)){

            return new Byd();
        }
        else {
            return null;  // 可以继续扩展需要添加的车的类型。
            // 是不满足开闭原则(扩展开放,对修改关闭)
        }
    }

}

// 静态工厂的另一种方式
 class CarFactory1 {
      public static  Car createAudi(){
          return new Audi();
      }
      public static Car createByd(){
          return new Byd();
      }
  }

//客户端的使用
public class Client{

    public static void main(String[] args) {  // 调用者,需要关联的东西太多。

//      Car c1 = new Audi();
//      Car c2 = new Byd(); 
//      c1.run();
//      c2.run();

        //  简单工厂模式
        // 通过多增加一个类,实现了更加详细的分工。
        Car c1  = CarFactory.createCar("奥迪");
        Car c2 =  CarFactory.createCar("比亚迪");
        Car c3 = CarFactory1.createAudi();
        Car c4 = CarFactory1.createByd();       
        c1.run();
        c2.run();
        c3.run();
        c4.run();

    }
}

参看

高淇三百集视频

猜你喜欢

转载自blog.csdn.net/qq_31156277/article/details/80806277