设计模式之工厂
本章有工厂方法和抽象工厂设计模式
工厂方法
工厂方法 定义一个用于创建对象的接口,让子类决定实例化哪一个类。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
抽象工厂
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
抽象工厂模式和工厂方法不太一样,它要解决的问题比较复杂,不但工厂是抽象的,产品是抽象的,而且有多个产品需要创建,因此,这个抽象工厂会对应到多个实际工厂,每个实际工厂负责创建多个实际产品:
- 抽象工厂
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;
}
}
- 抽象产品
public interface IHouse {
String getHouseName();
}
public interface IUser {
String getName();
Integer getAge();
}
- 实际产品
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();
}
}
总结
工厂方法用静态工厂替代
抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;
抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交道。