工厂模式提供了一种创建对象的最佳方式,创建对象时不会对客户端暴露创建逻辑。
分类
工厂模式有 3 种不同的实现方式
1.简单工厂模式:传入相关的类型来返回相应的类,这种方式比较单 一,可扩展性相对较差;
2.工厂方法模式:通过实现类实现相应的方法来决定相应的返回结果,这种方式的可扩展性比较强;
3.抽象工厂模式:基于上述两种模式的拓展,且支持细化产品
简单工厂模式
核心组成
1.抽象类:简单工厂模式所创建对象的父类
2.若干个抽象类的子类:简单工厂模式创建的就是这些类的对象
3.工厂类:简单工厂模式的核心,根据传入参数创建具体的对象
代码如下
有一个抽象类Computer,他的子类有笔记本Laptop,台式机Desktop,工厂类ComputerSimpleFactory的createComputer负责对象的创建
/**
* 电脑抽象类
*/
public abstract class Computer {
/**
* 开机方法
*/
public abstract void powerOn();
}
/**
* 笔记本电脑类
*/
public class Laptop extends Computer{
@Override
public void powerOn() {
System.out.println("笔记本电脑开机");
}
}
/**
* 台式机类
*/
public class Desktop extends Computer {
@Override
public void powerOn() {
System.out.println("台式机开机");
}
}
/**
* 工厂类
*/
public class ComputerSimpleFactory {
/**
* 私有化构造方法
*/
private ComputerSimpleFactory(){
}
/**
* 根据传入类型创建对象
* @param computerType
* @return
*/
public static Computer createComputer(String computerType){
if(computerType.equalsIgnoreCase("laptop")){
return new Laptop();
}else if (computerType.equalsIgnoreCase("desktop")){
return new Desktop();
}
return null;
}
}
工厂方法模式
对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则
与简单工厂相比,定义了一个抽象工厂类与实现/继承该工厂类的具体工厂类
核心组成
1.抽象产品类
2.具体产品类
3.抽象工厂类
4.具体工厂类
与简单工厂模式相比,增加了如下代码
/**
* 抽象工厂方法
*/
public interface ComputerFactory {
Computer createComputer();
}
/**
* 台式机工厂
*/
public class DesktopFactory implements ComputerFactory{
@Override
public Computer createComputer() {
return new Desktop();
}
}
/**
* 笔记本工厂
*/
public class LaptopFactory implements ComputerFactory{
@Override
public Computer createComputer() {
return new Laptop();
}
}
图解如下
优点:
符合开闭原则,增加一个产品类,只要实现具体的产品类和具体的工厂类;
符合单一职责原则,每个工厂只负责生产对应的产品