图解设计模式: 有趣的工厂模式

工厂模式 Factory Method

在工厂模式中 父子类的关系就像是生产工厂中模具一样, 由父类负责指定实例生成的方式 子类来决定生成具体的类. 具体的处理全部交给子类负责,目的就是为了将生产实例的框架和负责实例生产类解耦

示例程序

从下面这段示例来看看工厂模式到底能为我们做些什么。

类列表

image-20221219192835521

framwork包
产品类

在framework包里 定义了产品,也就是说实现了这个类的对象都可以成为产品 他们都可以被使用

public abstract class Product {
    public abstract void use();
}

工厂类

在framework中同样定义了工厂, 工厂类用来创造产品和注册产品

public abstract class Factory {
    public final Product create(String owner) {
        Product product = createProduct(owner);
        registerProduct(product);
        return product;
    }

    protected abstract Product createProduct(String owner);

    protected abstract void registerProduct(Product product);
}
IDCard包
id卡

id卡继承产品类 来体现我们框架分离的目的

public class IDcard extends Product {

    private String owner;

    IDcard(String owner) {
        System.out.println("制作" + owner + "的ID卡");
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println("使用" + owner + "ID卡.");
    }

    public String getOwner() {
        return this.owner;
    }
}

IDCardFactory

继承工厂类 用来生产产品和注册产品。

public class IDCardFactory extends Factory {
    private List owners = new ArrayList();

    @Override
    protected Product createProduct(String owner) {
        return new IDcard(owner);
    }

    @Override
    protected void registerProduct(Product product) {
        owners.add(((IDcard) product).getOwner());
    }

    public List getOwners() {
        return owners;
    }
}

测试
public class Test {
    public static void main(String[] args) {
        IDCardFactory factory = new IDCardFactory();
        Product card1 = factory.create("小红");
        Product card2 = factory.create("小明");
        Product card3 = factory.create("小刚");
        card1.use();
        card2.use();
        card3.use();

    }
}

image-20221219195521751

工厂模式的角色

在工厂模式中 我们将编写的包分离开来了,一个为framework(框架) 一个为具体的实现

这两个包的内容是平行的 如下图

类图

image-20221219195837240

Product角色

这个角色属于框架的类型 ,它定义了工厂方法中生成的实例所持有的api 具体的处理由继承了product的角色来决定

Creator创建者

Creator 也是属于框架的类型 他负责生成产品对象的抽象类,具体如何去生成由继承创建者的子类去决定

ConcreteProduct具体的产品

属于加工的类型 他决定了生成什么样的。

ConcreteCreator(具体的创建者)

ConcteteCreator 角色属于具体加工的乙方,他负责生辰具体的产品。

拓展思路

框架与加工

支持 我们分别学习了框架与具体加工这两方面的内容 他们被分别的封装到两个包中。

我们可以用相同的框架闯江湖其他的产品和工厂, 如我们要创建电视机 和 创建电视机的工厂类,这个时候我们就需要在框架保重编写电视机包

这里我们不需要修改框架包中的代码 只需要去修改对应的实现类就行了

生成实例 方法的三种实现方式

在工厂包中的生成产品方法是抽象方法 也就是需要在子类中实现这个方法, 创建产品的实现方式一般有三种

  • 指定一个抽象方法
  • 实现默认的处理 如果自类没有实现方法 将会默认处理
  • 在处理的其中抛出异常
使用模式与开发的小Tips

在日常开发中 使用模板方法或者是工厂模式的时候,因为要多读多个类的代码,缕清逻辑变得格外的重要,通常在设计模式设计子类的时候 需要想维护这些类的人员传达明确意图,擅自修改可能会出现事故

拓展实例

给产品增加id(以100开始) 并且希望 id和产品名存储在一个对应结构

我们只需要改动具体的实现就可以了

public class IDcard extends Product {

    private String owner;
    private int idNum = 100;

    IDcard(String owner, int idNum) {
        System.out.println("制作" + owner + "(" + idNum + ")" + "的ID卡");
        this.owner = owner;
        this.idNum = idNum;
    }

    @Override
    public void use() {
        System.out.println("使用" + owner + "(" + idNum + ")" + "的ID卡");
    }


    public String getOwner() {
        return this.owner;
    }

    public int getIdNum() {
        return idNum;
    }
}

public class IDCardFactory extends Factory {
    //private List owners = new ArrayList();

    Map<Integer, String> idcard = new HashMap();
    private int idNum = 100;

    @Override
    protected synchronized Product createProduct(String owner) {
        return new IDcard(owner, idNum++);
    }

    @Override
    protected void registerProduct(Product product) {
        idcard.put(((IDcard) product).getIdNum(), ((IDcard) product).getOwner());
    }

    public Map<Integer, String> getIdcard() {
        return idcard;
    }

    //public List getOwners() {
    //    return owners;
    //}
}

image-20221219202704384

我们可以发现 我们没有改动使用的方式也没有改动框架,只是修改了实现就可以完成效果的变化,可见设计模式的思路精妙

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《图解23种设计模式pdf》是一本以图解方式呈现的设计模式学习资料。本书通过图文并茂的方式,详细介绍了23种常用的设计模式,对于初学者来说非常友好。 设计模式是软件开发领域中常用的设计思想和经验总结。通过学习设计模式,可以帮助我们更好地理解和应用面向对象设计的原则和理念。而这本《图解23种设计模式pdf》通过图解的形式,将抽象的设计概念用简单易懂的方式呈现出来,让初学者更容易理解和学习。 这本书从创建型、结构型和行为型三个方面介绍了各种设计模式。创建型设计模式包括单例模式工厂模式、建造者模式等,用于对象的创建和初始化;结构型设计模式包括适配器模式、装饰器模式、代理模式等,用于对象的组合和组织;行为型设计模式包括观察者模式、策略模式、迭代器模式等,用于对象之间的相互作用。 每一种设计模式都有详细的图解和示例代码。通过学习这些图解和代码示例,我们可以更好地理解每个设计模式的应用场景和实现方式。同时,这本书也给出了每个设计模式的优缺点和适用情况,帮助读者更好地选择和应用设计模式。 总之,《图解23种设计模式pdf》是一本非常实用的设计模式学习资料。无论是对于初学者还是有经验的开发者来说,这本书都能够帮助我们更好地理解和应用设计模式,提高软件开发的质量和效率。 ### 回答2: 《图解23种设计模式PDF》是一本简洁清晰的设计模式入门指南。这本书通过图解的方式,详细介绍了23种常见的设计模式,让读者能够更加直观地理解和使用这些模式。 首先,这本书对设计模式进行了系统的分类和组织,可以帮助读者更好地理解各种模式之间的关系。书中将设计模式分为三大类:创建型模式、结构型模式和行为型模式。每种模式都有一个独特的图解和相应的示例代码,使读者能够更容易地理解这些模式的原理和应用场景。 其次,这本书特别注重实际应用。每个设计模式都有对应的实际案例,并且通过示例代码对其进行了详细解释。通过这些案例,读者可以了解如何使用设计模式解决真实世界中的问题,并学会将其应用于自己的项目中。 此外,这本书还提供了一些设计模式的最佳实践和注意事项。这些内容对于读者在使用设计模式时具有指导作用,并能帮助读者避免一些常见的错误。 总之,《图解23种设计模式PDF》是一本适合初学者的设计模式入门指南。通过图解和实例,读者可以快速掌握各种设计模式的原理和应用,并学会将其灵活运用于自己的项目中。无论是想了解设计模式的基本概念,还是想提高自己的设计能力,这本书都是一个很好的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷环渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值