建造者模式

设计模式

  

建造者模式

  建造者模式将复杂对象的创建与表示分离, 使得同样的构建过程可以创建不同的表示. 客户端通过指导者获得最终产品, 指导者通过建造者构造具体产品, 最终的产品通过建造者返回给指导者.

设计原则

  1. 分步骤创建复杂对象, 使构建复杂对象变得不那么复杂;
  2. 构建和表示分离, 更好地适应外部需求的变化; 构建和表示分离还存在这样一个优势: 构造的部分实现比较灵活, 外部需求变化比较大, 但是获得实例对象的过程是统一的, 也就是说无论外部存在多少需求, 变化, 都只不过是对象的表现形式不同罢了. 因些建造者模式对于复杂对象的创建具有其它模式不能替代的优势
  3. 单一职责原则, 提高软件内部的聚合度, 降低模块之间的耦合度.

Java JDK中的建造者模式

  1. java.lang.StringBuffer和java.lang.StringBuilder, 两者实现的功能是一样的, 都实现字符串缓冲区功能, 将数据转换成字符串
  2. StringBuffer是线程安全的, 而StringBuilder是线程不安全的.
  3. 不考虑多线程的因素, StringBuilder的效率比StringBuffer的效率要高一些.

建造者模式和抽象工厂模式的区别

  1. 建造者模式着重于分步骤构造一个复杂对象, 而抽象工厂模式则着重于多个系列的产品对象即对象族(简单或复杂的)的构造;
  2. 建造者模式是在最后一步返回具体产品, 而抽象工厂模式则是立即返回具体产品.

建造者模式的使用场合

  1. 当生成的产品对象内部具有复杂的结构时;
  2. 当复杂对象需要表示分离, 可能需要创建不同的表示时;
  3. 当需要向客户隐藏产品内部结构的表现时.

 

实现代码

//手机套餐
public class MobilePackage03
{
    private float money;
    private int shortInfo;
    private String music;
    
    public float getMoney()
    {
        return money;
    }
    public void setMoney(float money)
    {
        this.money = money;
    }
    public int getShortInfo()
    {
        return shortInfo;
    }
    public void setShortInfo(int shortInfo)
    {
        this.shortInfo = shortInfo;
    }
    public String getMusic()
    {
        return music;
    }
    public void setMusic(String music)
    {
        this.music = music;
    }
}    
//建造者接口
public interface IMobileBuilder03
{
    public void buildMoney();
    public void buildShortInfo();
    public void buildMusic();
    public MobilePackage03 getMobilePackage();
}
//抽象建造者
public abstract class AbstractBasePackage03
{
    protected MobilePackage03 mobilePackage03;
    
    public AbstractBasePackage03()
    {
        this.mobilePackage03 = new MobilePackage03();
    }
}
//具体的建造者
public class MobileBuilderImp1103 extends AbstractBasePackage03 implements  IMobileBuilder03
{
    public void buildMoney()
    {
        this.mobilePackage03.setMoney(11f);
    }

    public void buildShortInfo()
    {
        this.mobilePackage03.setShortInfo(100);
    }

    public void buildMusic()
    {
        this.mobilePackage03.setMusic("1103");
    }

    public MobilePackage03 getMobilePackage()
    {
        return this.mobilePackage03;
    }
}
//具体的建造者
public class MobileBuilderImp2203 extends AbstractBasePackage03 implements  IMobileBuilder03
{
    public void buildMoney()
    {
        this.mobilePackage03.setMoney(20f);
    }

    public void buildShortInfo()
    {
        this.mobilePackage03.setShortInfo(200);
    }

    public void buildMusic()
    {
        this.mobilePackage03.setMusic("2203");
    }

    public MobilePackage03 getMobilePackage()
    {
        return this.mobilePackage03;
    }
}
//手机套餐指导者
public class MobileDirector03
{
    public MobilePackage03 createMobilePackage03(IMobileBuilder03 builder03)
    {
        if(null != builder03)
        {
            builder03.buildMoney();
            builder03.buildShortInfo();
            builder03.buildMusic();
            
            return builder03.getMobilePackage();
        }
        
        return null;
    }
}
//客户端
public class MobileMain
{
    public static void main(String[] args)
    {
        MobileDirector03 director03 = new MobileDirector03();
        MobileBuilderImp1103 imp1103 = new MobileBuilderImp1103();
        MobileBuilderImp2203 imp2203 = new MobileBuilderImp2203();
        
        printMessage(director03.createMobilePackage03(imp1103));
        printMessage(director03.createMobilePackage03(imp2203));
    }
    
    public static void printMessage(MobilePackage03 package03)
    {
        System.out.println("---话费: " + package03.getMoney() + "\t 短信: " + package03.getShortInfo() + "\t 彩铃: " + package03.getMusic());
    }
}

 

转载于:https://www.cnblogs.com/jin12/p/5567747.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值