前言
记录一下学习23种常用设计模式之一:工厂模式
。
所谓工厂模式在我个人理解就是按照一套规范的流程,生产出一系列符合标准的产品。
比如:汽车生产车间按照不同的组成,生产出一辆汽车所需的所有零件,最后组装成一辆汽车。
对于用户而言,无需关注整个的生产过程是怎样的,只需要提出要求(要买一辆宝马),那么工厂就可以按照需求生产出用户所需要的产品(汽车)。
一、简单工厂模式
简单工厂模式:所有的产品都是在一个工厂中生产出来的,这种模式不常用,下面是实现简单工厂模式的代码。
/**
* 定义生产一辆汽车的规范
*/
public interface Car {
String getName();
}
/**
* 具体的产品,生产过程要符合Car定义的规范
*/
public class Aodi implements Car{
@Override
public String getName() {
return "Aodi";
}
}
public class Baoma implements Car{
@Override
public String getName() {
return "Baoma";
}
}
public class Benchi implements Car{
@Override
public String getName() {
return "Benchi";
}
}
/**
* 简单工厂的实现
*/
public class SimpleFactory {
/**
* 通过传入的参数来判断具体要生产的汽车
* @param name 名称
* @return 结果
*/
public String getCar(String name) {
if ("Benchi".equals(name)) {
return new Benchi();
} else if ("Baoma".equals(name)) {
return new Baoma();
} else if ("Aodi".equals(name)) {
return new Aodi();
} else {
System.out.println("无法生产" + name + "品牌的汽车");
return null;
}
}
}
/**
* 测试简单工厂
*/
public class SimpleFactoryTest {
public static void main(String[] args) {
SimpleFactory simpleFactory = new SimpleFactory();
// 根据用户的需求,生产出指定的产品,同时对用户隐藏了生产的细节
System.out.println(simpleFactory.getCar("Benchi"));
}
}
二、工厂模式
标准的工厂模式:对于不同产品,有不同生产车间。代码如下:
/**
* 工厂模型
*/
public interface Factory {
// 指定工厂要生产的产品
Car getCar();
}
/**
* 不同的工厂生产不同的产品(汽车)
*/
public class AodiFactory implements Factory{
@Override
public Car getCar() {
return new Aodi();
}
}
public class BaomaFactory implements Factory{
@Override
public Car getCar() {
return new Baoma();
}
}
public class BenchiFactory implements Factory{
@Override
public Car getCar() {
return new Benchi();
}
}
/**
* 测试工厂
*/
public class FactoryTest {
public static void main(String[] args) {
// 用户根据需求选择对应的工厂
Factory factory = new BaomaFactory();
System.out.println(factory.getCar());
}
}
三、抽象工厂模式
最常用的工厂模式:便于扩展,符合开闭原则
。代码如下:
/**
*
* 抽象工厂是用户的主入口
* 在Spring中应用得最为广泛的一种设计模式
* 易于扩展
*/
public abstract class AbstractFactory {
/**
* 获得一辆奔驰
*/
public abstract Car getBenchi();
/**
* 获得一辆宝马
*/
public abstract Car getBaoma();
/**
* 获得一辆奥迪
*/
public abstract Car getAodi();
// 后续如果有新需求,可以在这里扩展,且用户无感知
}
/**
* 抽象工厂的实现
*/
public class CarFactory extends AbstractFactory{
@Override
public Car getBenchi() {
// 这里同时也结合了工厂模式
return new BenchiFactory().getCar();
}
@Override
public Car getBaoma() {
return new BaomaFactory().getCar();
}
@Override
public Car getAodi() {
return new AodiFactory().getCar();
}
}
/**
* 测试抽象工厂
*/
public class AbstractFactoryTest {
public static void main(String[] args) {
CarFactory factory = new CarFactory ();
// 只保留了用户的选择权,保证了程序的健壮性
System.out.println(factory.getAodi());
}
}
总结
运用工厂模式
很好的解决了生产一套符合规范的标准产品的需求,用户无需关心具体的生产细节即可得到满意的产品。