声明:任何设计模式的初衷都是为了简化代码,不要为了使用某种模式生搬硬套,理解一种设计模式的思想,不要钻牛角尖
工厂设计模式分为:简单工厂模式,工厂方法模式,抽象工厂模式
简单理解:工厂模式就是来为我们生产我们需要的对象的,我们把参数传进去,不用管其内部细节
一:简单工厂模式
准备工厂需要生产的东西:
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,完结.
我们在使用的时候,一定要根据实际情况灵活改变,设计模式只是给我们提供思路的,不应成为桎梏我们思维的枷锁