自己的博客之旅就从Java设计模式开始,记录和督促自己的学习!!!
《一》工厂设计模式:
1.工厂模式的三类
1) 简单工厂模式
2 ) 工厂模式
3 ) 抽象工厂模式
2.简单工厂模式
又被称为静态工厂,如其名,这个模式非常简单,本质就是一个工厂类角色接收不同的参数返回不同的产品。该工厂类扮演的就是一个调度员的功能,又它来决定创建什么样的对象。
简单工厂模式的组成:
1) 工厂类角色 : 核心类,根据接收参数创建不同的产品类
public class CarFactory {
public static Car createCar(String name){
switch (name) {
case "bmw":
return new BmwCar();
case "benz":
return new BenzCar();
default:
return null;
}
}
}
2) 抽象产品角色: 具体产品的公用接口或者抽象父类
public abstract class Car {
public abstract void show();
}
3) 具体产品角色:工厂类创建的产品实现类
public class BenzCar extends Car {
@Override
public void show() {
System.out.println("这是奔驰");
}
}
public class BmwCar extends Car{
@Override
public void show() {
System.out.println("这是一辆宝马牌轿车");
}
}
从上面的例子可以看出,如果我们要新增一款车,那么就必须在工厂类的switch判断逻辑中增加代码,这样不符合Java的开闭原则,不易于扩展和维护,这要是简单工厂模式的一个致命缺点。
3.工厂模式
工厂模式是对简单工厂模式的一种扩展,创建产品的工厂不再只是一个,而是由多个继承或实现了抽象工厂的具体工厂创建不同的产品。
工厂模式的组成:
1) 抽象工厂角色:所有具体工厂实现或继承的父抽象工厂
public interface CarFactory {
Car creatCar();
}
2) 具体工厂角色:创建具体实例的工厂,每一个都实现或继承了父抽象工厂
public class BenzFactory implements CarFactory {
@Override
public BenzCar creatCar() {
return new BenzCar();
}
}
public class BmwCarFactory implements CarFactory {
@Override
public BmwCar creatCar() {
return new BmwCar();
}
}
3) 抽象产品角色:具体产品的公用接口或者抽象父类
public abstract class Car {
public abstract void show();
}
4) 具体产品角色 :具体工厂创建的实体类
public class BmwCar extends Car {
@Override
public void show() {
System.out.println("这是宝马");
}
}
public class BenzCar extends Car {
@Override
public void show() {
System.out.println("这是奔驰");
}
}
工厂模式就是对简单工厂模式的扩展,用不同类型的具体工厂创建不同的产品,从而符合开闭原则,也更易于扩展,但是同样也存在一个问题:当
产品类型过于复杂造成工厂类也随之过于庞大,将引起类的爆增,非常不便于维护。
4.抽象工厂模式
抽象工厂模式提供了创建一系列相关或相互依赖的对象,简单来说,工厂模式下的工厂只能创建一个产品,而抽象工厂模式下的工厂可以创建一个或多个产品,它针对的是有多个产品结构的产品。
5.总结
(1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。不符合开闭原则,不易于扩展和维护。
(2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。产品树过于复杂会造成类的暴增。
(3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。
总而言之,这三类工厂设计模式没有优劣之分,都有自己对应的应用场景,有时候又可以搭配使用,工厂模式和抽象工厂模式也很容易相互转换。