时间:2022-11-05 12:22:15 | 栏目:JAVA代码 | 点击:次
本系列专栏会以虹猫蓝兔七侠传的故事为例来给大家详细分析所有模式,希望能给大家带来帮助!
模式: 简单工厂模式
案例: 一个天外陨石(抽象产品),三把剑(产品),
一个铸剑师(工厂)。
虹猫蓝兔莎莉分别找铸剑师造了三把剑。
工厂模式的定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
1、按实际业务场景划分,工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。
2、我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。
1、工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责,很方便的创建出相应的产品。工厂和产品的职责区分明确。
2、客户端无需知道所创建具体产品的类名,只需知道参数即可。
3、也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。
1、简单工厂模式的工厂类单一,负责所有产品的创建,职责过重,一旦异常,整个系统将受影响。且工厂类代码会非常臃肿,违背高聚合原则。
2、使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
3、系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
4、简单工厂模式使用了 static 工厂方法,造成工厂角色无法形成基于继承的等级结构。
对于产品种类相对较少的情况,考虑使用简单工厂模式。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑,可以很方便地创建所需产品。
案例的主要角色如下:
工厂(SimpleFactory):铸剑师
抽象产品(Product):天外陨石(铸剑的原材料)
具体产品(ConcreteProduct):长虹剑、冰魄剑、紫云剑
案例: 虹猫蓝兔莎莉分别找铸剑师打造三把剑,长虹剑、冰魄剑、紫云剑。铸剑师利用原材料天外陨石来铸造这三把剑。
Ss接口(天外陨石):
接口内声明了一个方法
public interface Ss { void show(); }
Aa类实现接口Ss(长虹剑):
实现Ss接口
public class Aa implements Ss { @Override public void show() { System.out.println("打造了一把长虹剑"); } }
Bb类实现接口Ss(冰魄剑):
实现Ss接口
public class Bb implements Ss { @Override public void show() { System.out.println("打造了一把冰魄剑"); } }
Cc类实现接口Ss(紫云剑):
实现Ss接口
public class Cc implements Ss { @Override public void show() { System.out.println("打造了一把紫云剑"); } }
Zz类(铸剑师):
声明一个Ss类型属性,声明一个abc方法,用来判断需要造哪把剑,返回一把剑对象。
public class Zz { private static Ss ss; public Ss abc(String a) { if ("长虹剑".equals(a)) { ss = new Aa(); } else if ("冰魄剑".equals(a)) { ss = new Bb(); } else if ("紫云剑".equals(a)) { ss = new Cc(); } else { System.out.println("铸剑失败"); } return ss; } }
Demo测试类:
new一个铸剑师(工厂对象),调用铸剑师的方法传入需要造的剑,返回一个剑的对象,然后调用剑对象中的方法看看造的对不对。
public class Demo { public static void main(String[] args) { Zz zz = new Zz(); Ss aa = zz.abc("长虹剑"); aa.show(); Ss bb = zz.abc("冰魄剑"); bb.show(); Ss cc = zz.abc("紫云剑"); cc.show(); Ss dd = zz.abc("aa"); } }
下期预告
模式: 普通工厂模式
案例: 七侠找铸剑师夫妇造剑
敬请期待