myeclipse怎么创建jframe类_创建型-建造者模式

一个对象创建的时候,需要各种初始化化,有一套复杂的创建流程,如果这些流程散布在系统各个地方的话,会越来越难以维护,因此建造者模式就是把一套复杂的创建某个具体产品的流程,管理起来。

定义:

将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式又叫创建者模式。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。在用户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象。

类图:

2b104562d6716f849386e4cee66b8adf.png

cf086178a3d71329709705080b08d708.png

包含以下角色:

  • 导演类:负责调用适当的建造者来组建产品,导演类一般不与产品类发生依赖关系,一般充当提出需求的角色。与导演类直接交互的是建造者类。一般来说,导演类被用来封装程序中易变的部分。
  • 抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。
  • 建造者:实现抽象类的所有未实现的方法,具体来说一般是两项任务:组建产品;返回组建好的产品。其实内部还是调用产品的函数。
  • 产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。

模式流程:

  • 指挥者(Director)直接和客户(Client)进行需求沟通,控制建造者制造产品,最后给客户返回完整的产品;
  • 其中,在指挥者中控制构建的流程,建造者类只负责各个部件功能模块的实现;
  • 其中,建造者基类可以派生出不同的建造者子类来构建不同的产品;
  • 导演类提出需求之后,任务交接给了建造者。建造者有个基类来约定建造流程和返回产品等功能,由具体的建造者实施建造。

例子:

外部用户无需知道汽车是怎么创造出来的,他只需要给一个导演讲,他想要一个大众汽车,那么导演自动返回一个大众汽车。

用户有不同的需求,导演就有不同的手段来满足需求,来支配建造者实际真正的造一个东西出来, 在建造者建造的过程中,不断的给产品加装新功能,最终一件成品就出来啦。只不过加装的过程中,调用的是产品自己的加装函数。如: 汽车.设置发动机(发动机A);

导演只有一个,他可以造大众和悍马等不同的产品;

建造者有一套相同的流程,被抽象成了一个基类,具体的建造流程的实现,由子类来实现,比如 造大众建造者类和造悍马建造者类;

产品也继承同一个基类,派生出不同的产品类;

这样,我们既可以清晰的理出装配的流程,又能装配出不同的物品来。

代码实现:

游戏开发中,角色的创建可能比较复杂,因此需要建造者模式来创建角色并进行一些初始化。

角色分为玩家和敌人,他们的初始化方式有设置出生位置和设置技能。

当外部需要创建玩家或者敌人时,只需要告诉导演类,然后导演类控制角色创建的流程,建造者控制角色各个单独功能的实现。

产品:

 //产品基类
abstract class Product
{
    public abstract void SetPosition();
    public abstract void SetSkill();

    public abstract void ShowInfo();
}

//产品子类:玩家类
class Player : Product
{
    public override void SetPosition()
    {
        Console.WriteLine("玩家设置位置");
    }

    public override void SetSkill()
    {
        Console.WriteLine("玩家设置技能");
    }

    public override void ShowInfo()
    {
        Console.WriteLine("玩家:位置xx,技能xx");
    }
}

//产品子类:敌人类
class Enemy : Product
{
    public override void SetPosition()
    {
        Console.WriteLine("敌人设置位置");
    }

    public override void SetSkill()
    {
        Console.WriteLine("敌人设置技能");
    }

    public override void ShowInfo()
    {
        Console.WriteLine("敌人:位置xx,技能xx");
    }
}

建造者:

//建造者基类
abstract class Builder
{
    abstract public void SetProductPosition();
    abstract public void SetProductSkill();

    abstract public Product GetProduct();
}

//建造者子类:玩家建造者
class PlayerBuilder : Builder
{
    Player player = new Player();

    public override void SetProductPosition()
    {
        player.SetPosition();
    }

    public override void SetProductSkill()
    {
        player.SetSkill();
    }

    public override Product GetProduct()
    {
        return player;
    }
}

//建造者子类:敌人建造者
//...

导演类:

//导演类:负责建造流程的控制
class Director
{
    //创建玩家
    public Product CreatePlayer()
    {
        PlayerBuilder playerBuilder = new PlayerBuilder();
        playerBuilder.SetProductPosition();
        playerBuilder.SetProductSkill();
        return playerBuilder.GetProduct();
    }

    //创建敌人
    public void CreateEnemy()
    {
        //...同上,略
    }
}

客户端:

void Main()
{
    Director director = new Director();
    Product player = director.CreatePlayer();

    player.ShowInfo();
}

灵魂拷问:

1.工厂与建造者模式的联系和区别?
造汽车
工厂与建造者模式:工厂负责制造汽车,组装过程和细节在工厂内的建造者来实现;
买汽车
汽车购买者(用户):你只需要说出你需要的型号(对象的类型和内容),然后直接购买就可以使用了
(不需要知道汽车是怎么组装的(车轮、车门、发动机、方向盘等等))

工厂模式和建造者模式的关系:
与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族 。
在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象 。
如果将抽象工厂模式看成汽车配件生产工厂,生产一个产品族的产品,那么建造者模式就是一个汽车组装工厂,通过对部件的组装可以返回一辆完整的汽车

2.还是这个玩家和敌人的例子,如果将建造者和工厂模式结合起来,应该怎么设计代码呢?

建造者代码不需要怎么修改,只需要加上工厂代码即可。其实就是把之前工厂内部直接new 一个对象,变成由建造者来详细建造。

导演类做成单例模式:

//导演类:负责建造流程的控制
class Director
{
    //单例
    public static Director ins = new Director();

    //...
}

工厂代码:

//工厂基类
abstract class Factory
{
    abstract public Product NewProduct();
}

//玩家工厂
class PlayerFactory : Factory
{
    public override Product NewProduct()
    {
        return Director.ins.CreatePlayer();
    }
}

//敌人工厂
//...

客户端:

void Main()
{
    Product player = new PlayerFactory().NewProduct();
    player.ShowInfo();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值