工厂模式
解释
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
作用
- 解耦;例如我们去买电脑,不用工厂模式,自己需要new一个电脑,相当于自己造了台电脑,有了工厂模式我们只需要给工厂说要什么牌子电脑,不用管电脑怎样创造的;没有什么是加一层解决不了的;
- 扩展性高;如果想增加一个产品,只要扩展一个工厂类就可以。
- 易维护,减少代码量; 屏蔽产品的具体实现,调用者只关心产品的接口。
分类
1、简单工厂模式(不属于23种设计模式,实际用的最多)
- 创建一个接口
public interface Computer {
void produce();
}
- 接口实现类
DellComputer类
public class DellComputer implements Computer {
public void produce() {
System.out.println("买戴尔电脑");
}
}
LenovoComputer类
public class LenovoComputer implements Computer {
public void produce() {
System.out.println("买联想电脑");
}
}
- 创建一个工厂,按传的参数创建对象
public class ComputerFactory {
public Computer buyComputer(String name){
if(name.equals("dell")){
return new DellComputer();
}else if(name.equals("lenovo")){
return new LenovoComputer();
}else{
return null;
}
}
}
- 使用工厂,获取相应的对象
import org.junit.Test;
public class TestComputer {
@Test
public void getComputer(){
ComputerFactory computerFactory=new ComputerFactory();
Computer computer=computerFactory.buyComputer("dell");
computer.produce();
}
}
- 执行结果
缺点
若是现在想买华硕电脑,就需要改工厂类中的逻辑,这就不符合oop七大原则中的开闭原则(对扩展开放,对修改关闭)故引出工厂模式;
2、工厂模式
2. 新增产品acer
AcerComputer类
public class AcerComputer implements Computer {
@Override
public void produce() {
System.out.println("买宏碁电脑");
}
}
- 声明工厂接口
public interface Factory {
public Computer createComputer();
}
- 生产acer的工厂类
public class AcerComputerFactor implements Factory {
@Override
public Computer createComputer() {
return new AcerComputer();
}
}
- 生产lenovo的工厂类
public class LenovoComputerFactor implements Factory {
@Override
public Computer createComputer() {
return new LenovoComputer();
}
}
- 生产dell的工厂类
public class DellComputerFactor implements Factory {
@Override
public Computer createComputer() {
return new DellComputer();
}
}
- 使用工厂,获取相应的对象
import org.junit.Test;
public class TestComputer {
@Test
public void getComputer(){
Factory factory;
factory=new DellComputerFactor();
factory.createComputer().produce();
}
}
- 运行结果
缺点
无论加多少类,我们都不用修改原来类中的代码,而是通过增加工厂类来实现,但是如果类过多的话,就要创建多个工厂,麻烦;
总结
简单工厂:一个工厂类,一个产品抽象类。
工厂方法:多个工厂类,一个产品抽象类。