创建类模式PK

创建类模式

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

工厂方法模式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个例子可以看出,工厂方法模式和建造者模式都属于对象创建类模式。均是用来创建类的对象。但他们之间的区别还是很明显的。

  • 意图不同
    • 工厂模式是一个对象创建的粗线条应用,建造者模式则是通过细线条勾勒出一个复杂对象, 关注的是产品组成部分的创建过程。
  • 产品的复杂度不同
    • 厂方法模式的对象粒度比较粗,建造者模式的产品对象粒度比较细。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值