简单工厂模式
简单工厂模式不属于23种设计模式,它是工厂方法模式的一种特例。
简单工厂模式又称为静态工厂模式,在简单工厂模式中,可以通过传入的参数不同创建不同的实例对象
通常包含以下角色
- 工厂角色Factory
- 抽象产品角色Product
- 具体产品角色ConcreteProduct
这里我们设计一个客户购买汽车的事例
抽象产品角色Car
public interface Car{
public void name();
}
具体产品角色Wuling Tesla
public class Wuling implements Car{
public void name(){
System.out.println("五菱");
}
}
public class Tesla implements Car{
public void name(){
System.out.println("特斯拉");
}
}
工厂角色CarFactory
用来生产车辆
public class CarFactory{
public static Car getCar(String name){
if(name.equals("五菱"){
return new Wuling();
}else if(name.equals("特斯拉"){
return new Tesla();
}else{
return null;
}
}
}
我们客户需要买车,直接从CarFactory里面去拿,客户不用关心内部是怎么去实现生产车的,只需要告诉工厂我需要什么样的车
public class Consumer{
public static void main(String[] args){
Car car1=CarFactory.getCar("五菱");
Car car2=CarFactory.getCar("特斯拉");
car1.name();
car2.name();
}
}
但是这里有一个需求,我们设计了一个新的产品Mobai,需要加入车工厂
根据简单工厂模式,我们需要一个具体产品的类Mobai,但是工厂代码必须要改变,不满足开闭原则,所以提出来一个新的设计模式==>工厂方法模式
工厂方法模式
在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而共产子类则负责生产具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成
通常包含以下四个角色
- 具体产品角色ConcreteProduct
- 抽象产品角色Product
- 具体工厂ConcreteFactory
- 抽象工厂Factory
这里的具体产品和抽象产品和简单工厂模式一样,我们再增加一个新的产品Mobai
public class Mobai implements Car{
public void name(){
System.out.println("摩拜");
}
}
抽象工厂CarFactory
public interface CarFactory{
public Car getCar();
}
具体工厂
public class WulingFactory implements CarFactory{
public Car getCar(){
return new Wuling();
}
}
public class TeslaFactory implements CarFactory{
public Car getCar(){
return new Tesla();
}
}
如果是之前的简单工厂模式需要修改原代码才能增加产品,这里工厂方法模式可以在符合开闭原则的前提下增加产品
public class Mobai implements CarFactory{
public Car getCar(){
return new Mobai();
}
}
客户去买车,直接去对应的车工厂去提车
public class Consumer{
public static void main(String[] args){
Car car1=new WulingFactory().getCar();
Car car2=new TeslaFactory().getCar();
Car car3=new MobaiFactory().getCar();
car1.name();
car2.name();
car3.name();
}
}
总结
- 简单工厂模式虽然不符合设计原则,但是无论从结构复杂度,代码复杂度,编程复杂度,管理上的复杂度来看,明显比工厂模式简单,所以使用最多
- 不修改已有类的前提下,通过增加新的工厂类实现扩展