复习:GoF的23种设计模式之Factory Method模式(创建型)

2019-12-25 16:07:34 浏览数 (1)

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再更新

发现上面大闸蟹的例子还是不好理解,感觉更懵了,重新想了一个例子。

请问:假如你是程序员,敌方飞机怎么创建,需要明确飞机有大小颜色速度等等属性。游戏在循环打飞机中,我们怎么创建飞机对象?

我的做法是:创建多个具体工厂生产飞机,每个工厂生产不同的大小速度飞机,只需要几个工厂,就足以迭代一堆小飞机。

0 人点赞