工厂设计模式

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

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

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

你可能感兴趣的:(工厂设计模式)