前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >复习:GoF的23种设计模式之Factory Method模式(创建型)

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

作者头像
营琪
发布2019-12-25 16:07:34
2710
发布2019-12-25 16:07:34
举报
文章被收录于专栏:营琪的小记录营琪的小记录

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Factory Method模式(工厂方法)
  • 示例代码:
    • UML类图
    相关产品与服务
    验证码
    腾讯云新一代行为验证码(Captcha),基于十道安全栅栏, 为网页、App、小程序开发者打造立体、全面的人机验证。最大程度保护注册登录、活动秒杀、点赞发帖、数据保护等各大场景下业务安全的同时,提供更精细化的用户体验。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档