简单工厂模式、工厂方法模式、抽象工厂模式

82 阅读2分钟

简单工厂模式

简单工厂模式不满足开闭原则,每添加一个新的类型产品就需要修改工厂类。

//抽象产品接口
public interface Car {
}
//具体产品类
public class ACar implements Car{
}
public class BCar implements Car{
}
工厂类
public class CarFactory {

    public static Car createCar(String type){
        if (type.equals("A")) {
            return new ACar();
        } else if (type.equals("B")) {
            return new BCar();
        }
        return null;
    }
}

工厂方法设计模式

  • 用途:将对象创建延迟到子类。

  • 示例

    • JDK:Collection.iterator()(不同集合返回不同的迭代器)
    • Spring:BeanFactorygetBean() 是工厂方法)
    • Log4j:LoggerFactory.getLogger() 对于工厂方法设计模式,在新增新的产品时只需要创建新的产品类及对应工厂类,每种产品类都有自己的工厂类,满足开闭原则。
//抽象产品接口
public interface Car {
}
//具体产品类
public class ACar implements Car{
}
public class BCar implements Car{
}
//抽象产品工厂
public interface CarFactory {
    Car createCar();
}
//具体产品工厂
public class ACarFactory implements CarFactory{
    public Car createCar() {
        return new ACar();
    }
}
public class BCarFactory implements CarFactory{
    public Car createCar() {
        return new BCar();
    }
}

抽象工厂模式

  • 用途:创建相关对象族。

  • 示例

    • JDK:javax.xml.transform.TransformerFactory.newInstance()
    • Spring:ListableBeanFactory(生产多种类型的 Bean)

抽象工厂提供对象创建的方法,但是并不是每个具体工厂都要实现每个方法,每个工厂只重写实现自己需要的方法完成产品的创建,这样可以满足不同工厂之间产品不一致的情况。比如A工厂生产汽车,手机,而B工厂只生产手机,这样B工厂只重写生产手机的方法,如果B工厂也要生产汽车即重写奇对应方法即可。(以上仅是自己看了AQS的tryAquire()方法的实现后的想法,选择性重写,如果不对希望大家可以指正)

//抽象产品
public interface Car {
}
public interface Phone {
}

A企业的产品

public class ACar implements Car{
}
public class APhone implements Phone{
}

B企业的产品

public class BCar implements Car{
}
public class BPhone implements Phone{
}

C企业的产品

public class CCar implements Car{
}
//抽象工厂
public abstract class Factory {
    public final Car createCar(){
        Car car=tryCreateCar();
        if (car==null){
            throw new UnsupportedOperationException("如需要请自行实现");
        }
        return car;
    }

    protected Car tryCreateCar() {
        return null;
    }

    public final Phone createPhone(){
        Phone phone=tryPhone();
        if (phone==null){
            throw new UnsupportedOperationException("如需要请自行实现");
        }
        return phone;
    }

    protected Phone tryPhone() {
        return null;
    }

}

A工厂类

public class AFactory extends Factory{
    @Override
    protected Car tryCreateCar() {
        return new ACar();
    }

    @Override
    protected Phone tryPhone() {
        return new APhone();
    }
}

B工厂类

public class BFactory extends Factory{
    @Override
    protected Phone tryPhone() {
        return new BPhone();
    }

    @Override
    protected Car tryCreateCar() {
        return new BCar();
    }
}

C工厂类,C工厂只生产汽车

public class CFactory extends Factory{
    @Override
    protected Car tryCreateCar() {
        return new CCar();
    }
}