zoukankan      html  css  js  c++  java
  • 工厂模式

    简单工厂模式有一个缺陷,那就是不符合OCP开闭原则,当我们想生产一辆新品种车型时,必须修改简单工厂类源码。而工厂模式由于一种工厂只生产一种产品。当我们需要生产一辆新品种汽车,只需要新建一个新品类的工厂即可,即对增加开放,对修改关闭。符合开闭原则。

    在UML图上可以清晰的看出,工厂模式只比简单工厂模式多一个角色:抽象工厂,其可以是抽象类也可以是接口,还是以生产汽车为例举例说明工厂方法设计模式的原理

    public class FactoryDemo {
      interface Car {
        void run();
    
        void stop();
    
        String brand();
      }
    
      static class BMW540Li implements Car {
    
        @Override
        public void run() {
          System.out.println("BMW540Li启动");
        }
    
        @Override
        public void stop() {
          System.out.println("BMW540Li停止");
        }
    
        @Override
        public String brand() {
          return "宝马";
        }
      }
    
      static class AudiA7 implements Car {
    
        @Override
        public void run() {
          System.out.println("AudiA7启动");
        }
    
        @Override
        public void stop() {
          System.out.println("AudiA7停止");
        }
    
        @Override
        public String brand() {
          return "奥迪";
        }
      }
    
      interface CarFactroy{
        Car factory();
      }
    
      static class BMWFactory implements CarFactroy{
        @Override
        public Car factory() {
          return new BMW540Li();
        }
      }
    
      static class AudiFactory implements CarFactroy{
        @Override
        public Car factory() {
          return new AudiA7();
        }
      }
    
    
      public static void main(String[] args) {
        BMWFactory bmwFactory = new BMWFactory();
        Car car1 = bmwFactory.factory();
        car1.run();
        car1.stop();
        System.out.println("我的品牌是:"+car1.brand());
    
        System.out.println("----------------------");
    
        AudiFactory audiFactory = new AudiFactory();
        Car car2 = audiFactory.factory();
        car2.run();
        car2.stop();
        System.out.println("我的品牌是:"+car2.brand());
      }
    }


    BMW540Li启动
    BMW540Li停止
    我的品牌是:宝马
    ----------------------
    AudiA7启动
    AudiA7停止
    我的品牌是:奥迪
    
    
    
     
  • 相关阅读:
    EMV内核使用中的常见问题
    SM2国密证书合法性验证
    WP8.1中C++的winodws运行时组件位移操作的差异
    [源码]Literacy 快速反射读写对象属性,字段
    Vue 单文件元件 — vTabs
    vue-router路径计算问题
    前端跨域新方案尝试
    Vue 单文件原件 — vCheckBox
    JavaScript 功能类 Url.js
    Vue 学习笔记 — 组件初始化
  • 原文地址:https://www.cnblogs.com/sstone/p/8465961.html
Copyright © 2011-2022 走看看