创建类模式PK

    xiaoxiao2023-10-31  152

    创建类模式

    包含工厂方法模式、建造者模式、抽象工厂模式、单例模式和原型模式。他们可以提供对象的创建和管理职责。其中的单例模式和原型模式非常容易理解。单例模式是要保持在内存中只有一个对象。原型模式是要求通过复制的方法产生一个新的对象。剩下的就是工厂方法模式、抽象工厂模式和建造者模式了, 这三个之间有较多的相似性。

    工厂方法模式VS建造者模式

    工厂方法模式:

    抽象类方法 /** * Author: 王蒙Sanm * Date: 2019/5/25 15:17 * Description: 超人抽象类 */ public abstract class SuperMan { //每个超人都有特殊的能力 public abstract void specialTalent(); } 成人超人继承能力超人抽象类 /** * Author: 王蒙Sanm * Date: 2019/5/25 15:22 * Description: 成年超人 */ public class AdultSuperMan extends SuperMan { @Override public void specialTalent() { System.out.println("超人力大无穷"); } } 幼年超人继承超人抽象类 /** * Author: 王蒙Sanm * Date: 2019/5/25 15:23 * Description: 幼年超人 */ public class ChildSuperMan extends SuperMan { @Override public void specialTalent() { System.out.println("小超人的能力是刀枪不入、快速运动"); } } 工厂模式入口类 /** * Author: 王蒙Sanm * Date: 2019/5/25 15:26 * Description: */ public class CreateSuperManFactory { public static <T extends SuperMan> T createSuperMan(Class<T> c) { SuperMan superMan = null; try { superMan = (SuperMan) Class.forName(c.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return (T) superMan; } } 工厂模式的调用类 /** * Author: 王蒙Sanm * Date: 2019/5/25 15:30 * Description: */ public class Client { public static void main(String[] args) { SuperMan superMan = CreateSuperManFactory.createSuperMan(AdultSuperMan.class); superMan.specialTalent(); } } 通过以上的方法可以创建一批批超人,包括幼年超人或者成年超人。当然这些超人都是一个样子。所以也就是说,工厂模式关注的是一个产品的整体,生产出的产品应该具有相似的功能和框架。

    建造者模式

    超人类的定义 /** * Author: 王蒙Sanm * Date: 2019/5/25 15:58 * Description: 超人类的定义 */ //该注解在这里不做详细介绍,可自行百度 @Data public class SuperMan { // 超人的躯体 private String body; //超人的特殊技能 private String specialTalent; //超人的标志 private String specialSymbol; } 超人抽象构造者 /** * Author: 王蒙Sanm * Date: 2019/5/25 16:01 * Description: 超人抽象构造者 */ public abstract class Builder { //定义一个超人应用 protected final SuperMan superMan = new SuperMan(); //构建出超人的躯体 public void setBody(String body) { this.superMan.setBody(body); } //构建出超人的特殊技能 public void setSpecialTalent(String st) { this.superMan.setSpecialTalent(st); } //构建出超人的特殊标记 public void setSpecialSymbol(String ss) { this.superMan.setSpecialSymbol(ss); } //构建出一个完整的超人 public abstract SuperMan getSuperMan(); //一個超人的模版方法模式。超人的各个部分都准备好了。具体怎么组装则是由实现类来决定, } 成年超人建造者 /** * Author: 王蒙Sanm * Date: 2019/5/25 16:11 * Description:- 成年超人建造者 */ public class AdultSuperManBuilder extends Builder { @Override public SuperMan getSuperMan() { super.setBody("强壮的身体"); super.setSpecialTalent("会飞行"); super.setSpecialSymbol("胸前带S标记"); return super.superMan; } } 幼年超人建造者 /** * Author: 王蒙Sanm * Date: 2019/5/25 16:14 * Description: */ public class ChilderSuperManBuilder extends Builder { @Override public SuperMan getSuperMan() { super.setBody("strong body!"); super.setSpecialTalent("刀枪不入"); super.setSpecialSymbol("胸前带小S标记"); return super.superMan; } } 导演类 /** * Author: 王蒙Sanm * Date: 2019/5/25 16:18 * Description: 导演类 */ public class Director { public static <T extends Builder> SuperMan createBuilder(Class<T> c) { Builder builder = null; try { builder = (Builder) Class.forName(c.getName()).newInstance(); } catch (Exception e) { e.printStackTrace(); } return builder.getSuperMan(); } } 场景类 /** * Author: 王蒙Sanm * Date: 2019/5/25 16:22 * Description: 场景类 */ public class ClientBuilder { public static void main(String[] args) { //成年超人信息 SuperMan superMan = Director.createBuilder(AdultSuperManBuilder.class); System.out.println(superMan.toString()); //幼年超人信息 SuperMan childSuperMan = Director.createBuilder(ChilderSuperManBuilder.class); System.out.println(childSuperMan.toString()); } }

    上述2个例子可以看出,工厂方法模式和建造者模式都属于对象创建类模式。均是用来创建类的对象。但他们之间的区别还是很明显的。

    意图不同 工厂模式是一个对象创建的粗线条应用,建造者模式则是通过细线条勾勒出一个复杂对象, 关注的是产品组成部分的创建过程。 产品的复杂度不同 厂方法模式的对象粒度比较粗,建造者模式的产品对象粒度比较细。
    最新回复(0)