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

    为了帮助更好的理解工厂模式,我们采用汽车生产的例子

    1. 工厂模式

    建立一个接口,通过实现类,在实现类中进行实例化产品对象。一般实现类称为Factory,从实现类中拿到新对象,就像去工厂中取货一样,我们不自己生产(new)对象,只向工厂进行申请。

    2. 分类

    • 简单工厂模式
    • 工厂方法模式
    • 抽象工厂模式(严格来说不算工厂模式,但是我觉得很像)

    3. 简单工厂模式

    场景1:今天我去找厂长买车,我说要买奥迪,他就造奥迪,我说要买宝马,他就造宝马。反正他厂里生产线都有。

    /**
     * 汽车类接口
     * Created by wjj on 2021/1/4
     */
    public interface Car {
    }
    
    /**
     * 奥迪
     * Created by wjj on 2021/1/4
     */
    public class Audi implements Car{
        public Audi() {
            System.out.println("这是一辆奥迪");
       }
    }
    
    /**
     * 宝马
     * Created by wjj on 2021/1/4
     */
    public class BMW implements Car {
       public  BMW(){
           System.out.println("这是一辆宝马");
       }
    }
    
    /**
     * 汽车生产厂
     * Created by wjj on 2021/1/4
     */
    public class Factory {
        public static Car CreateCar(String str){
            if("BMW".equals(str)){
                /*
                根据业务场景需要,可以在这里对请求的对象pojo操作
                * */
                return new BMW();
            } else if("Audi".equals(str)){
                 /*
                根据业务场景需要,可以在这里对请求的对象pojo操作
                * */
                return new Audi();
            }else
                return null;
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Factory carFac=new Factory();
            Car Audi = carFac.CreateCar("Audi");
            Car BMW = carFac.CreateCar("BMW");
        }
    }
    /*
    这是一辆奥迪
    这是一辆宝马
    */
    

    4. 工厂方法模式

    4.1. “开放-封闭”原则

    对扩展开放,对修改关闭。简单来说添加新功能时,可以加代码,但是不能改以前的代码。简单工厂模式在工厂实现类内部固定了生产类型,因此不符合开闭原则。

    场景2:今天我和厂长说我需要一辆奔驰,厂长说没有这个,我说一定要有,厂长说那只能把厂拆了重新加一个奔驰生产线。
    显然,这样很不好。为了解决这种问题,于是就有了工厂方法模式。

    4.2. 工厂方法模式

    场景3:厂长把生产线都分开了,每个分厂一个生产线,按同一个模式装修。这样当有新的需求的时候,不需要动原来的厂,只要按照同一个模式再开一个新分厂就好了。

    /**
     * 工厂接口
     * Created by wjj on 2021/1/4
     */
    public interface Factory {
        public Car create();
    }
    
    /**
     * 奥迪生产厂
     * Created by wjj on 2021/1/4
     */
    public class AudiFactory implements Factory{
        public AudiFactory() {
            System.out.println("这是奥迪车厂");
        }
    
        @Override
        public Car create() {
            return new Audi();
        }
    }
    
    /**
     * 奔驰厂
     * Created by wjj on 2021/1/4
     */
    public class BenzFactory implements Factory{
        public BenzFactory() {
            System.out.println("这是奔驰车厂");
        }
    
        @Override
        public Car create() {
            return new Benz();
        }
    }
    
    /**
     * 宝马生产厂
     * Created by wjj on 2021/1/4
     */
    public class BMWFactory implements Factory{
        public BMWFactory() {
            System.out.println("这是宝马车厂");
        }
    
        @Override
        public Car create() {
            return new BMW();
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Factory carFac1=new BenzFactory();
            Car Benz = carFac1.create();
            Factory carFac2=new AudiFactory();
            Car Audi = carFac2.create();
            Factory carFac3=new BMWFactory();
            Car BMW = carFac3.create();
        }
    }
    /*
    这是奔驰车厂
    这是一辆奔驰
    这是奥迪车厂
    这是一辆奥迪
    这是宝马车厂
    这是一辆宝马
    */
    

    5. 抽象工厂模式

    前面的工厂模式的特点在于都只有一个产品,那么如果一个厂要生产多个产品怎么处理?

    场景4:今天我不光买了车,我还要自己买一个配套的备胎,厂长说我的厂没有备胎。那怎么办?和上面一样,我的工厂装修里都多一个生产备胎的生产线不就好了

    /**
     * 备胎轮子接口
     * Created by wjj on 2021/1/4
     */
    public interface Wheel {
    }
    
    public class AudiWheel implements Wheel{
        public AudiWheel() {
            System.out.println("这是奥迪轮子");
        }
    }
    
    public class BenzWheel implements Wheel {
        public BenzWheel() {
            System.out.println("这是奔驰轮子");
        }
    }
    
    public class BMWWheel implements Wheel{
        public BMWWheel() {
            System.out.println("这是奔驰轮子");
        }
    }
    
    public interface Factory {
        public Car createCar();
        public Wheel createWheel();
    }
    
    public class AudiFactory implements Factory {
        public AudiFactory() {
            System.out.println("这是奥迪车厂");
        }
        
        @Override
        public Car createCar() {
            return new Audi();
        }
    
        @Override
        public Wheel createWheel() {
            return new AudiWheel();
        }
    }
    
    public class BenzFactory implements Factory {
        public BenzFactory() {
            System.out.println("这是奔驰车厂");
        }
    
        @Override
        public Car createCar() {
            return new Benz();
        }
    
        @Override
        public Wheel createWheel() {
            return new BenzWheel();
        }
    }
    
    public class BMWFactory implements Factory {
        public BMWFactory() {
            System.out.println("这是宝马车厂");
        }
    
        @Override
        public Car createCar() {
            return new BMW();
        }
    
        @Override
        public Wheel createWheel() {
            return new BMWWheel();
        }
    }
    
  • 相关阅读:
    Redis学习手册(实例代码)
    来博客园一年了
    Redis学习手册(管线)
    Redis学习手册(持久化)
    Redis学习手册(目录)
    在博客园的第100篇博客
    Redis学习手册(主从复制)
    Redis学习手册(内存优化)
    JS弹出模式提示窗体,实现页面其他地方不可编辑效果
    prototype属性使用说明
  • 原文地址:https://www.cnblogs.com/wjune-0405/p/14231659.html
Copyright © 2011-2022 走看看