zoukankan      html  css  js  c++  java
  • 浅谈简单工厂、工厂模式、抽象工厂

    一:简单工厂模式

    简单工厂的定义:提供一个创建对象实例的功能,而无序关心其具体实现,被创建实例的类可以是接口、抽象类也可以是具体的类。

    实现汽车接口

    package GOF.factory.simpleFactory;
    
    /**
     * 公共汽车接口
     */
    public interface Car {
        public String getCarName();
    }

    奔驰类

    package GOF.factory.simpleFactory;
    
    /**
     * 奔驰类
     */
    public class BenChi implements Car {
        @Override
        public String getCarName() {
    //        System.out.println("奔驰");
            return "奔驰";
        }
    }

    宝马类

    package GOF.factory.simpleFactory;
    
    public class BaoMa  implements Car{
        @Override
        public String getCarName() {
    //        System.out.println("宝马");
            return "宝马";
        }
    }

    简单工厂

    package GOF.factory.simpleFactory;
    
    /**
     * 简单工厂
     * 既能生产奔驰又能生产宝马
     */
    public class SimpleFactory {
        public Car getCar(String name){
            if(name.equals("BMW")){
                return new BaoMa();
            }else if (name.equals("Ben")){
                return new BenChi();
            }else {
                System.out.println("暂时无法生产!");
                return null;
            }
        }
    }

    测试类

    package GOF.factory.simpleFactory;
    
    public class test {
        public static void main(String[] args) {
            SimpleFactory simpleFactory = new SimpleFactory();
            Car car1 = simpleFactory.getCar("Ben");
            System.out.println(car1.getCarName());
            Car car2 = simpleFactory.getCar("BMW");
            System.out.println(car2.getCarName());
        }
    }

    测试结果

    根据简单工厂的定义,用户只要产品而不在乎如何生产,看起来好像很完美的样子,但是大家想想,这个世界存在什么都生产的工厂吗?

    显然是不存在的,每一个汽车品牌都有自己的生产工厂,都有自己的技术,映射到spring中,我们有很多很多的bean需要生产,如果单靠一个简单工厂来实现,那么我们得在工厂嵌套多少个if..else啊?

    而且我们在代码中生产一辆汽车只是new一下就出来了,但是实际操作中却不知道需要多少进行操作,加载、注册等操作都将体现在工厂类中,那么这个类就会变得很紊乱,管理起来也很不方便,所以说每个品牌应该有自己的生产类。所以工厂方法出现了。

    二、工厂方法

    工厂接口

    package GOF.factory.factoryMethod;
    
    import GOF.factory.simpleFactory.Car;
    
    /**
     * 定义工厂接口,功能就是生产汽车
     */
    public interface Factory {
        Car getCar();
    }

    宝马工厂

    package GOF.factory.factoryMethod;
    
    import GOF.factory.simpleFactory.BaoMa;
    import GOF.factory.simpleFactory.Car;
    
    public class BMWFactory implements Factory {
        @Override
        public Car getCar() {
            return new BaoMa();
        }
    }

    奔驰工厂

    package GOF.factory.factoryMethod;
    
    import GOF.factory.simpleFactory.BenChi;
    import GOF.factory.simpleFactory.Car;
    
    public class BenzFactory implements Factory {
    
        @Override
        public Car getCar() {
            return new BenChi();
        }
    }

    测试类

    package GOF.factory.factoryMethod;
    
    public class test {
        public static void main(String[] args) {
            //宝马
            Factory factory = new BMWFactory();
            System.out.println(factory.getCar().getCarName());
    
            //奔驰
            Factory factory1 = new BenzFactory();
            System.out.println(factory1.getCar().getCarName());
        }
    }

    测试结果

    根据上述代码可以看出,不同的品牌的汽车是由不同的工厂生产的,貌似又是很完美的。但是大家看一下测试类,当一个人想要去买一辆宝马汽车的时候,那么他就要找宝马工厂给他生产一辆,过几天有想要买一辆奔驰车的时候,又得跑到奔驰工厂请人生产,这无疑就增加了用户的操作复杂性。所以有没有一种方法方便用户操作呢?这个时候抽象工厂就出现了。

    三、抽象工厂

     抽象工厂

    public abstract class AbstractFactory {
    
         protected abstract Car getCar();
         
         //这段代码就是动态配置的功能
         //固定模式的委派
         public Car getCar(String name){
            if("BMW".equalsIgnoreCase(name)){
                return new BmwFactory().getCar();
            }else if("Benz".equalsIgnoreCase(name)){
                return new BenzFactory().getCar();
            }else if("Audi".equalsIgnoreCase(name)){
                return new AudiFactory().getCar();
            }else{
                System.out.println("这个产品产不出来");
                return null;
            }
        }
    }

    默认工厂

    public class DefaultFactory extends AbstractFactory {
    
        private AudiFactory defaultFactory = new AudiFactory();
        
        public Car getCar() {
            return defaultFactory.getCar();
        }
    
    }

    宝马工厂

    public class BMWFactory extends AbstractFactory {
        @Override
        public Car getCar() {
            return new BMW();
        }
    }

    奔驰工厂

    public class BenzFactory extends AbstractFactory {
        @Override
        public Car getCar() {
            return new Benz();
        }
    }

    测试类

    public class AbstractFactoryTest {
        public static void main(String[] args) {        
            DefaultFactory factory = new DefaultFactory();  
            System.out.println(factory.getCar("Benz").getName());            
        }
    }

    测试结果

    Benz

    根据上述代码可以看出,用户需要一辆汽车,只需要去找默认的工厂提出自己的需求(传入参数),便能得到自己想要产品,而不用根据产品去寻找不同的生产工厂,方便用户操作。

  • 相关阅读:
    愚公oracle数据库同步工具
    外部服务的隔离及降级
    使用redis来实现分布式锁
    php 无限极栏目 Tree 树格式 层级显示 【列表记录按顺序缩进显示】
    腾讯地图添加多marker标注样式
    MIME 视频 , 文件下载与播放权限
    php json_encode 对浮点 精度 问题 解决
    phpexcel 导入 时间格式 和 数值格式 处理
    phpexcel写入追加已有的excel文件
    php 判断字符串是否可以转 浮点型
  • 原文地址:https://www.cnblogs.com/daijiabao/p/11249363.html
Copyright © 2011-2022 走看看