1. 简单工厂模式
简单工厂模式,按照我在现实中的理解是:生产统一规格的商品,当然了,你可以生产其他商品的东西,假设我们生产的是汽车~那么我们可以生产一下汽车
那么我们既然说到了统一规格就需要定义一个接口,代码如下:
package com.robam.factory.simple;
/**
* @author Zerox
* @date 2018/12/24 10:04
*/
public interface Car {
/**
* 上面我们已经说到了,这里面我们定义的是规格
* a.要求必须是几个轱辘
* b.要求必须是汽油类
* c.要求必须有安全气囊
*
* 工厂工厂~什么是工厂?生产商品~生产统一规格的商品
* 那么就我们这个造车车间估计也就能生产个汽车了~自行车恐怕都生产不了
* 没那么大规格的自行车~烧油,四个轱辘的,还配有安全气囊!原谅我的贫穷。。。我真的没见过
* @return
*/
Car getCar();
}
package com.robam.factory.simple;
/**
* @author Zerox
* @date 2018/12/24 10:12
*/
public class AudiCar implements Car{
/**
* 生产一辆奥迪车
* @return
*/
@Override
public Car getCar() {
return new AudiCar();
}
}
package com.robam.factory.simple;
/**
* @author Zerox
* @date 2018/12/24 10:11
*/
public class BenzCar implements Car{
/**
* 生产一辆奔驰车
*
* @return
*/
@Override
public Car getCar() {
return new BenzCar();
}
}
package com.robam.factory.simple;
/**
* @author Zerox
* @date 2018/12/24 10:10
*/
public class BmwCar implements Car{
/**
* 生产一辆宝马车
* @return
*/
@Override
public Car getCar() {
return new BmwCar();
}
}
package com.robam.factory.simple;
import com.sun.org.apache.bcel.internal.generic.RETURN;
/**
* @author Zerox
* @date 2018/12/24 10:13
*/
public class SimpleFactory {
public Car getMyCar(String carName) {
if (carName.equalsIgnoreCase("Audi")) {
return new AudiCar();
} else if (carName.equalsIgnoreCase("Benz")) {
return new BenzCar();
} else if (carName.equalsIgnoreCase("BMW")) {
return new BmwCar();
} else {
System.out.println("不好意思~本公司没有!");
return null;
}
}
}
- 1.测试类代码如下
package com.robam.factory.simple;
import org.junit.Test;
/**
* @author Zerox
* @date 2018/12/24 10:16
*/
public class SimpleFactoryTest {
@Test
public void testSimpleFactory() {
SimpleFactory simpleFactory = new SimpleFactory();
System.out.println(simpleFactory.getMyCar("audi"));
System.out.println(simpleFactory.getMyCar("benz"));
System.out.println(simpleFactory.getMyCar("bmw"));
}
}
优点: 使用者和开发端完全隔离,就好比我们去买猪肉~从不关心这个猪到底怎么成长的
缺点: 缺点也是很明显的,那就是如果我们新加入一个四驱车的话,那么需要去修改SimpleFactory中的方法,违背了开闭原则(对扩展开放,对修改关闭)
2. 工厂方法模式
工厂方法模式,上面所说的我们也知道了,其实我们仔细一想有点小夸张,就是我没有见过一个工厂能生产这么多的车!既能产宝马,又能产奔驰~只要是符合标准的都能生产!
显然,这样的工厂是不存在的现实中的情况是宝妈有宝马的生产工厂,奔驰有奔驰的生产工厂,我家的自行车恩。。好吧,确实是我在二手市场买零件回来组装的,这也说明了
我家只能是一个自行车加工厂
上面我们已经说到了规格不能改变,所以还是需要有一个通用的接口Car(),之后需要把各自的车辆按照品牌分配到各自的车间就可以了,那么话又说回来了,车都有标准了,工厂可能会没有标准么?
显然是有的,工厂会有什么标准呢?
a.车间安全标准
b.车间排气标准
代码如下
package com.robam.factory.factory_method;
import com.robam.factory.simple.Car;
/**
* @author Zerox
* @date 2018/12/24 10:32
*/
public interface Factory {
/**
* a.车间安全标准
* b.车间排气标准
*
*
* @return 按照该标准所生产的汽车
*/
Car getCarByFactoryStandard();
}
package com.robam.factory.factory_method;
import com.robam.factory.simple.AudiCar;
import com.robam.factory.simple.Car;
/**
* @author Zerox
* @date 2018/12/24 10:34
*/
public class AudiFactory implements Factory{
/**
* 奥迪车间产奥迪
*
* @return
*/
@Override
public Car getCarByFactoryStandard() {
return new AudiCar();
}
}
package com.robam.factory.factory_method;
import com.robam.factory.simple.BenzCar;
import com.robam.factory.simple.Car;
/**
* @author Zerox
* @date 2018/12/24 10:38
*/
public class BenzFactory implements Factory{
/**
* 奔驰车间产奔驰
*
* @return
*/
@Override
public Car getCarByFactoryStandard() {
return new BenzCar();
}
}
package com.robam.factory.factory_method;
import com.robam.factory.simple.BmwCar;
import com.robam.factory.simple.Car;
/**
* @author Zerox
* @date 2018/12/24 10:39
*/
public class BmwFactory implements Factory{
/**
* 别摸我车间产别摸我
*
* @return
*/
@Override
public Car getCarByFactoryStandard() {
return new BmwCar();
}
}
package com.robam.factory.factory_method;
import org.junit.Test;
/**
* @author Zerox
* @date 2018/12/24 10:40
*/
public class MethodFactoryTest {
@Test
public void testFactoryMethod() {
/** 产奥迪*/
Factory car = new AudiFactory();
System.out.println(car);
/** 产奔驰*/
car = new BenzFactory();
System.out.println(car);
/** 产宝马*/
car = new BmwFactory();
System.out.println(car);
}
}
优点: 可以看出完美解决了上面说到的"开闭原则",如果你想要新加一个产品类的话,只需要去实现Factory接口就可以了。
缺点: 客户点可以知道后面的代码逻辑,以前是封装起来的(在SimpleFactory中),现在完全暴露在了客户端
3. 抽象工厂模式
抽象工厂模式,该怎么说呢?我是这样子理解的,当我们在一系列产品中挑选一个产品时候(该系列产品同属于一家公司或者工厂生产),那么就需要做到根据我们自己的需求从这一些列产品中
生产出对应的,我们所想要的产品(我的认知是,抽象工厂模式将以上两种模式结合起来了)
package com.robam.factory.abstract_factory;
import com.robam.factory.simple.AudiCar;
import com.robam.factory.simple.BenzCar;
import com.robam.factory.simple.BmwCar;
import com.robam.factory.simple.Car;
/**
* @author Zerox
* @date 2018/12/24 11:05
*/
public abstract class AbstractFactory {
abstract Car getCar();
Car getMyCar(String carName) {
if (carName.equalsIgnoreCase("Audi")) {
return new AudiCar();
} else if (carName.equalsIgnoreCase("Benz")) {
return new BenzCar();
} else if (carName.equalsIgnoreCase("BMW")) {
return new BmwCar();
} else {
System.out.println("不好意思~本公司没有!");
return null;
}
}
}
package com.robam.factory.abstract_factory;
import com.robam.factory.simple.AudiCar;
import com.robam.factory.simple.Car;
/**
* @author Zerox
* @date 2018/12/24 11:07
*/
public class AudiFactory extends AbstractFactory{
@Override
Car getCar() {
return new AudiCar();
}
}
package com.robam.factory.abstract_factory;
import com.robam.factory.simple.BenzCar;
import com.robam.factory.simple.Car;
/**
* @author Zerox
* @date 2018/12/24 11:08
*/
public class BenzFactory extends AbstractFactory{
@Override
Car getCar() {
return new BenzCar();
}
}
package com.robam.factory.abstract_factory;
import com.robam.factory.simple.BmwCar;
import com.robam.factory.simple.Car;
/**
* @author Zerox
* @date 2018/12/24 11:08
*/
public class BmwFactory extends AbstractFactory{
@Override
Car getCar() {
return new BmwCar();
}
}
package com.robam.factory.abstract_factory;
import com.robam.factory.simple.Car;
/**
* @author Zerox
* @date 2018/12/24 11:11
*/
public class DefaultFactory extends AbstractFactory{
private AudiFactory defaultFactory = new AudiFactory();
@Override
Car getCar() {
return defaultFactory.getCar();
}
}
优点: 整合了简单工厂模式和工厂方法模式中的优点,如果说我们不这样做还是采用上面的工厂方法模式的话,如果我们需要加一个条件轮胎的供应商,如果加到工厂方法模式的话,就需要每个
工厂实现类都加上轮胎供应商的这个方法,如果我们在抽象工厂模式中,完全可以只在抽象类中将方法实现,客户端只需要将参数传进来即可!
发明抽象工厂方法模式的人好厉害!厉害厉害!
下个阶段,争取应用到项目中
代码github地址: [email protected]:xueh0430/design_model.git
*如果有问题欢迎指出