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

编程入门 行业动态 更新时间:2024-10-28 14:32:17

图解设计<a href=https://www.elefans.com/category/jswz/34/1771241.html style=模式: 有趣的工厂模式"/>

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

工厂模式 Factory Method

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

示例程序

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

类列表

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;}@Overridepublic void use() {System.out.println("使用" + owner + "ID卡.");}public String getOwner() {return this.owner;}
}
IDCardFactory

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

public class IDCardFactory extends Factory {private List owners = new ArrayList();@Overrideprotected Product createProduct(String owner) {return new IDcard(owner);}@Overrideprotected 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();}
}

工厂模式的角色

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

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

类图

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;}@Overridepublic 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;@Overrideprotected synchronized Product createProduct(String owner) {return new IDcard(owner, idNum++);}@Overrideprotected void registerProduct(Product product) {idcard.put(((IDcard) product).getIdNum(), ((IDcard) product).getOwner());}public Map<Integer, String> getIdcard() {return idcard;}//public List getOwners() {//    return owners;//}
}

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

更多推荐

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

本文发布于:2024-02-12 10:14:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1687340.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模式   有趣   工厂

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!