工厂模式
1.前言
设计模式大二的时候就学了,但是现在有些也忘得差不多了,现在决定重新学一遍。
立个flag,一周至少学三种设计模式。
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
2.简单工厂模式
应用实例: 你需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
/** 简单(静态)工厂模式
* @author aRu
* @date 2021/5/8 15:31
*/
public class CarFactory {
public static Car getCar(String name){
if(name.equals("大众")){
return new DaZhong();
}else if (name.equals("五菱")){
return new WuLing();
}
return null;
}
}
/**抽象汽车类
* @author aRu
* @date 2021/5/8 15:28
*/
public interface Car {
void Name();
}
/** 大众
* @author aRu
* @date 2021/5/8 15:29
*/
public class DaZhong implements Car{
@Override
public void Name() {
System.out.println("大众");
}
}
----------------------------------------------------------------------------------------
/**五菱
* @author aRu
* @date 2021/5/8 15:30
*/
public class WuLing implements Car{
@Override
public void Name() {
System.out.println("五菱");
}
}
测试
/** 测试类
* @author aRu
* @date 2021/5/8 15:34
*/
//测试 简单(静态)工厂模式
public class Test {
public static void main(String[] args) {
Car car1 = CarFactory.getCar("大众");
Car car2 = CarFactory.getCar("五菱");
car1.Name();
car2.Name();
}
}
缺点:试想当老板提出新需求要加一辆本田汽车的时候,你会发现,你此时不得不去修改CarFactory这个类,这就违反了开闭原则.
3.方法工厂模式
针对上面简单工厂的缺点,我们引出方法工厂模式。
在方法工厂模式中,我们将工厂抽象起来,使得每个品牌的汽车都有自己的工厂,而不是像简单工厂模式里,一个大工厂建造不同品牌的车。
当我们需要新添加汽车时,只需要添加新的汽车类和对应的工厂就好。
//抽象汽车工厂
public interface CarFactory {
Car getCar();
}
//具体的汽车工厂
public class WuLingFactory implements CarFactory{
//五菱工厂
@Override
public Car getCar() {
return new WuLing();
}
}
----------------------------------------------
public class DaZhongFactory implements CarFactory{
//大众工厂
@Override
public Car getCar() {
return new DaZhong();
}
}
//抽象汽车类
public interface Car {
void Name();
}
//具体汽车类
public class WuLing implements Car {
@Override
public void Name() {
System.out.println("五菱");
}
}
----------------------------------------
public class WuLing implements Car {
@Override
public void Name() {
System.out.println("五菱");
}
}
//方法工厂模式测试public class Test { public static void main(String[] args) { Car car = new WuLingFactory().getCar(); Car car2 = new DaZhongFactory().getCar(); car.Name(); car2.Name(); }}