工厂设计模式

作者: 选一个昵称这么难 | 来源:发表于2017-08-31 12:52 被阅读236次

    声明:任何设计模式的初衷都是为了简化代码,不要为了使用某种模式生搬硬套,理解一种设计模式的思想,不要钻牛角尖

    工厂设计模式分为:简单工厂模式,工厂方法模式,抽象工厂模式
    简单理解:工厂模式就是来为我们生产我们需要的对象的,我们把参数传进去,不用管其内部细节
    一:简单工厂模式
    准备工厂需要生产的东西:

    public abstract class Car {
        public abstract void showFeature();
    }
    
    public class AudiCar extends Car {
        @Override
        public void showFeature() {
            System.out.println("奥迪四个环");
        }
    
    }
    
    public class Benz extends Car {
        @Override
        public void showFeature() {
            System.out.println("奔驰三个尖");
        }
    }
    

    我们准备了两种车, AudiCar和Benz,下面创建一个工厂来生产这两种车:

    //用来生产汽车的工厂
    public class CarFactory {
        //根据传入的参数来生产不同的汽车
        public Car creatCar(String carName){
            if ("audi".equals(carName)){
                return new AudiCar();
            }else if ("benz".equals(carName)){
                return new Benz();
            }
            return null;
        }
    }
    

    使用:

    CarFactory carFactory = new CarFactory();
    Car audi = carFactory.creatCar("audi");
    Car benz = carFactory.creatCar("benz");
    audi.showFeature();
    benz.showFeature();
    

    结果打印:

    System.out: 奥迪四个环
    System.out: 奔驰三个尖
    

    说明:这个工厂类的写法并不完美,因为如果我们要增加一个汽车的品种就需要增加一个 else if判断,很麻烦,所以这里可以用反射来优化

     //传入的目标对象的完整路径名
        public Car creatCar2(String carName) {
            try {
                Class clazz = Class.forName(carName);
                try {
                    return (Car) clazz.newInstance();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    使用:
     Car audi = carFactory.creatCar2("com.dgtech.sss.cardemo.AudiCar");
    

    ok,这就是简单工厂模式,从中可以看出我们可以用CarFactory这个工厂类来为我们生产不同的汽车
    我们再来举一个常见的例子:
    BitmapFactory 这是一个用来生产bitmap对象的工厂,我们根据不同的方法传入不同的参数,就返回了我们需要的bitmap对象,我们看看Google程序员怎么给这个类定义的:

    /**
     * Creates Bitmap objects from various sources, including files, streams,
     * and byte-arrays.
     */
    

    很简单,我就不翻译了,希望大家更好的理解工厂设计模式的核心

    二:工厂方法模式
    这个用起来比较的麻烦
    简单说 就是生产每种产品都有对应的工厂类,而不是由一个工厂去生产几种产品
    产品类还是和上面一样,工厂类的实现变了

    public abstract class Factory {
        public abstract Car creatCar();
    }
    
    //只用来生产AudiCar的工厂
    public class AudiFactory extends Factory {
        @Override
        public Car creatCar() {
            return new AudiCar();
        }
    }
    
    //只用来生产BenzCar的工厂
    public class BenzFactory extends Factory {
        @Override
        public Car creatCar() {
            return new Benz();
        }
    }
    

    在简单工厂模式中,生产汽车只用了一个类,假如这个类出现了问题,会导致所有的产品都不能生产,因此出现了工厂方法模式,该模式规避了上面的问题,但是实现起来很麻烦

    三:抽象工厂模式

    理解抽象工厂,着重理解一点,就是抽象工厂重点是在给产品分类
    比如:
    汽车 我们可以分成给男士开的和给女士开的
    衣服 我们可以分成给男士穿的和给女士穿的

    那么我们可以这么分类:
    给男士开的汽车和给男士穿的衣服是一类
    给女士开的汽车和给女士穿的衣服是一类

    下面用代码来实现:

    汽车类:
    public abstract class Car {
        public abstract void showFeature();
    }
    
    public class ManCar extends Car {
        @Override
        public void showFeature() {
            System.out.println("给男士开的汽车");
        }
    }
    
    public class WomanCar extends Car {
        @Override
        public void showFeature() {
            System.out.println("给女士开的汽车");
        }
    }
    
    衣服类:
    public abstract class Cloth {
        public abstract void showCloth();
    }
    
    public class ManCloth extends Cloth {
        @Override
        public void showCloth() {
            System.out.println("给男士穿的衣服");
        }
    }
    
    public class WomanCloth extends Cloth {
        @Override
        public void showCloth() {
            System.out.println("给女士穿的衣服");
        }
    }
    

    工厂类:

    public abstract class Factory {
        public abstract Car creatCar();
        public abstract Cloth creatCloth();
    }
    
    //用来生产男士用品的工厂
    public class ManFactory extends Factory {
        @Override
        public Car creatCar() {
            return new ManCar();
        }
    
        @Override
        public Cloth creatCloth() {
            return new ManCloth();
        }
    }
    
    //用来生产女士用品的工厂
    public class WomanFactory extends Factory {
        @Override
        public Car creatCar() {
            return new WomanCar();
        }
    
        @Override
        public Cloth creatCloth() {
            return new WomanCloth();
        }
    }
    

    ok,完结.
    我们在使用的时候,一定要根据实际情况灵活改变,设计模式只是给我们提供思路的,不应成为桎梏我们思维的枷锁

    相关文章

      网友评论

        本文标题:工厂设计模式

        本文链接:https://www.haomeiwen.com/subject/fsqqjxtx.html