Factory Method模式(工厂方法)
这个模式我们有一个熟悉的名称,叫工厂模式,将生成实例的框架和实际负责生成实例的类解耦。
概念比较难理解,我大概用自己的语言总结一下,一个工厂,必然就有产品,假如就是一个大闸蟹吧,现在大闸蟹那么贵,以至于每一个大闸蟹都有一个身份验证码,由这个码我们可以查到地址、水质、健康状态等等信息。
现在有个问题,我们怎么生成这个码呢?也就是怎么生成大闸蟹这个类实例。
对于面向对象编程,我们习惯将万物化为对象,那么一个大闸蟹(Concrete Product)就是一个对象,也就是我们每生产一个大闸蟹都需要new Concrete Product 对象,再将很复杂的数据写进去,生成一个对象需要赋值很多数据。
对此,我们引入工厂模式,将这个工厂抽象为一个框架,并不负责实例的具体内容,工厂通过定义一个单独的创建对象的方法来解决,由工厂的子类实现这个方法,创建具体类型的对象。也就是创建大闸蟹由工厂统一负责,我们这些小贩没法处理。
示例代码:
代码语言:javascript复制public class FactoryMethodClient {
public static void main(String[] args) {
AbstractFactory factory = new AppleFactory();
factory.create("优质苹果");
factory.create("苹果");
factory = new TVFactory();
factory.create("中空");
factory.create("波音");
}
}
abstract class AbstractFactory{
public AbstractProduct create(String str) {
AbstractProduct product = createProduct(str);
registerProduct(product);
return product;
}
protected abstract AbstractProduct createProduct(String str);
protected abstract void registerProduct(AbstractProduct product);
}
abstract class AbstractProduct {
public abstract void use();
}
class Apple extends AbstractProduct{
private String str;
public Apple(String s) {
this.str = s "某个很复杂的过程,时间地点天气";
}
@Override
public void use() {
System.out.println("示例,可以吃" str);
}
}
class AppleFactory extends AbstractFactory{ //或者还有多个类似的子类
List<AbstractProduct> storage = new ArrayList<AbstractProduct>();
@Override
protected AbstractProduct createProduct(String str) {
return new Apple(str); //或者还有赋值、检测苹果异常等等
}
@Override
protected void registerProduct(AbstractProduct product) {
storage.add(product);
}
public List getAppleStorage() {
return storage;
}
}
//可以在不改变框架的情况下,生产电视了。
class TV extends AbstractProduct{
private String str;
public TV(String s) {
this.str = s "某个很复杂的过程,各种型号";
}
@Override
public void use() {
System.out.println("示例,可以看" str);
}
}
class TVFactory extends AbstractFactory{
List<AbstractProduct> storage = new ArrayList<AbstractProduct>();
@Override
protected AbstractProduct createProduct(String str) {
return new TV(str);
}
@Override
protected void registerProduct(AbstractProduct product) {
storage.add(product);
}
}
UML类图
2019-12-20再更新
发现上面大闸蟹的例子还是不好理解,感觉更懵了,重新想了一个例子。
请问:假如你是程序员,敌方飞机怎么创建,需要明确飞机有大小颜色速度等等属性。游戏在循环打飞机中,我们怎么创建飞机对象?
我的做法是:创建多个具体工厂生产飞机,每个工厂生产不同的大小速度飞机,只需要几个工厂,就足以迭代一堆小飞机。