设计模式之工厂

本章有工厂方法和抽象工厂设计模式

工厂方法

工厂方法 定义一个用于创建对象的接口,让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。

工厂方法的目的是使得创建对象和使用对象是分离的

工厂接口,工厂接口中带有静态方法返回真正的子类

public interface NumberFactory {
    Number parse(String s);

    public static NumberFactory getFactory() {
        return numberCreate;
    }

    static NumberFactory numberCreate = new NumberCreateImpl();
}
public class NumberCreateImpl implements NumberFactory {

    @Override
    public Number parse(String s) {
        return new BigDecimal(s);
    }
}

调用方可以完全忽略真正的工厂NumberFactoryImpl和实际的产品BigDecimal,这样做的好处是允许创建产品的代码独立地变换,而不会影响到调用方。

静态工厂

一个简单的parse()需要写这么复杂的工厂吗?实际上大多数情况下我们并不需要抽象工厂,而是通过静态方法直接返回产品

public class NumberFactory {
    public static Number parse(String s) {
        return new BigDecimal(s);
    }
}

这种简化的使用静态方法创建产品的方式称为静态工厂方法(Static Factory Method)。静态工厂方法广泛地应用在Java标准库中。例如:

Integer n = Integer.valueOf(100);

Integer既是产品又是静态工厂。它提供了静态方法valueOf()来创建Integer

抽象工厂

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

抽象工厂模式和工厂方法不太一样,它要解决的问题比较复杂,不但工厂是抽象的,产品是抽象的,而且有多个产品需要创建,因此,这个抽象工厂会对应到多个实际工厂,每个实际工厂负责创建多个实际产品:

  1. 抽象工厂
public interface AbstractFactory {

    IUser createUser(String name);

    IHouse createHouse(Integer age);

    static StudentFactory studentFactory = new StudentFactory();

    public static AbstractFactory createFactory(){
        if(true){
            return studentFactory;
        }
        //return otherFactory;
        return null;
    }
}
  1. 抽象产品
public interface IHouse {

    String getHouseName();

}
public interface IUser {

    String getName();

    Integer getAge();
}
  1. 实际产品
public class StudentUser implements IUser {
    @Override
    public String getName() {
        return null;
    }

    @Override
    public Integer getAge() {
        return null;
    }
}
public class StudentHouse implements IHouse{
    @Override
    public String getHouseName() {
        return null;
    }
}

4.实际工厂

public class StudentFactory implements AbstractFactory{
    @Override
    public IUser createUser(String name) {
        return new StudentUser();
    }

    @Override
    public IHouse createHouse(Integer age) {
        return new StudentHouse();
    }
}

总结

工厂方法用静态工厂替代

抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;

抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交道。

References

原文地址:https://www.cnblogs.com/wei57960/p/14530900.html