首页 > 其他分享 >享元模式

享元模式

时间:2022-11-05 22:12:26浏览次数:38  
标签:享元 pPiece 模式 IgoChessmanFactory int Coordinates new public

围棋
设计一个围棋软件,在系统中只存在一个白棋对象和一个黑棋对象,但是它们可以在棋盘的不同位置显示多次。

 

类图

 

 

Java

   
package rjsj.no13;

/**
 * 客户端测试类
 *
 */
public class Client {
    public static void main(String[] args) {
        IgoChessman black1,black2,black3,white1,white2;
        IgoChessmanFactory factory;
        factory = IgoChessmanFactory.getInstance();
        black1 = factory.getIgoChessman("b");
        black2 = factory.getIgoChessman("b");
        black3 = factory.getIgoChessman("b");
        System.out.println("判断两颗黑棋是否相同:"+(black1==black2));

        white1 = factory.getIgoChessman("w");
        white2 = factory.getIgoChessman("w");
        System.out.println("判断两颗白棋是否相同:"+(white1==white2));

        black1.locate(new Coordinates(1, 1));
        black2.locate(new Coordinates(2, 4));
        black3.locate(new Coordinates(2, 3));
        white1.locate(new Coordinates(3, 5));
        white2.locate(new Coordinates(2, 6));
    }

}
     
package rjsj.no13;

/**
 * 坐标类:外部状态类
 *
 */
public class Coordinates {
    private int x;
    private int y;

    public Coordinates(int x,int y) {
        // TODO Auto-generated constructor stub
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

}
     
package rjsj.no13;

/**
 * 围棋棋子类:抽象享元类
 *
 */
public abstract class IgoChessman {
    public abstract String getColor();
    public void locate(Coordinates coord){
        System.out.println("棋子颜色:"+this.getColor()+",棋子位置:"+coord.getX()+","+coord.getY());
    }
}
/**
 * 黑色棋子类:具体享元类
 * @author fly
 *
 */
class BlackIgoChessman extends IgoChessman{

    @Override
    public String getColor() {
        // TODO Auto-generated method stub
        return "黑色";
    }

}
/**
 * 白色棋子类:具体享元类
 * @author fly
 *
 */
class WhiteIgoChessman extends IgoChessman{

    @Override
    public String getColor() {
        // TODO Auto-generated method stub
        return "白色";
    }

}
     
package rjsj.no13;

import java.util.Hashtable;

/**
 * 围棋棋子工厂类:享元工厂类
 *
 */
public class IgoChessmanFactory {
    private static IgoChessmanFactory instance = new IgoChessmanFactory();
    private static Hashtable ht;

    public IgoChessmanFactory() {
        // TODO Auto-generated constructor stub
        ht = new Hashtable();
        IgoChessman black,white;
        black = new BlackIgoChessman();
        ht.put("b", black);
        white = new WhiteIgoChessman();
        ht.put("w", white);
    }

    public static IgoChessmanFactory getInstance(){
        return instance;
    }

    public static IgoChessman getIgoChessman(String color){
        return (IgoChessman)ht.get(color);
    }

}
 

 

C++

   
#include <iostream>
#include <map>
#include <vector>
using namespace std;

typedef struct Coordinates{
    int x;
    int y;

    Coordinates(){}
    Coordinates(int a, int b){x=a;y=b;}

    bool operator <(const Coordinates& other) const{
        if (x<other.x) return true;
        else if (x==other.x) return y<other.y;
        return false;
    }
}POINT;

typedef enum PieceColorTag{
    BLACK,
    WHITE
}PIECECOLOR;

class CPiece{
public:
    CPiece(PIECECOLOR color) : m_color(color){}
    PIECECOLOR GetColor() { return m_color; }
    void SetPoint(POINT point) { m_point = point; }
    POINT GetPoint() { return m_point; }

protected:
    PIECECOLOR m_color;
    POINT m_point;
};

class CGomoku : public CPiece{
public:
    CGomoku(PIECECOLOR color) : CPiece(color){}
};

class IgoChessmanFactory{
public:
    CPiece *GetPiece(PIECECOLOR color){
        CPiece *pPiece = NULL;
    if (m_vecPiece.empty()){
        pPiece = new CGomoku(color);
        m_vecPiece.push_back(pPiece);
    }
    else{
        for (vector<CPiece *>::iterator it = m_vecPiece.begin(); it != m_vecPiece.end(); ++it){
            if ((*it)->GetColor() == color){
                pPiece = *it;
                break;
            }
        }
        if (pPiece == NULL){
            pPiece = new CGomoku(color);
            m_vecPiece.push_back(pPiece);
        }
     }
        return pPiece;
    }

    ~IgoChessmanFactory(){
        for (vector<CPiece *>::iterator it = m_vecPiece.begin(); it != m_vecPiece.end(); ++it){
            if (*it != NULL){
                delete *it;
                *it = NULL;
            }
        }
    }

private:
    vector<CPiece *> m_vecPiece;
};

class IgoChessman{
public:
    void Draw(CPiece *piece){
        if (piece->GetColor()){
            cout<<"白色棋子位置:"<<piece->GetPoint().x<<","<<piece->GetPoint().y<<endl;
        }
        else{
            cout<<"黑色棋子位置:"<<piece->GetPoint().x<<","<<piece->GetPoint().y<<endl;
        }
        m_mapPieces.insert(pair<POINT, CPiece *>(piece->GetPoint(), piece));
    }

    void ShowAllPieces(){
        for (map<POINT, CPiece *>::iterator it = m_mapPieces.begin(); it != m_mapPieces.end(); ++it){
            if (it->second->GetColor()){
                cout<<"("<<it->first.x<<","<<it->first.y<<")白色棋子"<<endl;
            }
            else{
                cout<<"("<<it->first.x<<","<<it->first.y<<")黑色棋子"<<endl;
            }
        }
    }

private:
    map<POINT, CPiece *> m_mapPieces;
};

int main(){
    IgoChessmanFactory *pPieceFactory = new IgoChessmanFactory();
    IgoChessman *pCheseboard = new IgoChessman();
    CPiece *pPiece = pPieceFactory->GetPiece(WHITE);
    pPiece->SetPoint(POINT(1, 1));
    pCheseboard->Draw(pPiece);
    pPiece = pPieceFactory->GetPiece(BLACK);
    pPiece->SetPoint(POINT(3, 5));
    pCheseboard->Draw(pPiece);
    pPiece = pPieceFactory->GetPiece(WHITE);
    pPiece->SetPoint(POINT(2, 2));
    pCheseboard->Draw(pPiece);
    pPiece = pPieceFactory->GetPiece(BLACK);
    pPiece->SetPoint(POINT(1, 4));
    pCheseboard->Draw(pPiece);
}
 

 

运行截图

标签:享元,pPiece,模式,IgoChessmanFactory,int,Coordinates,new,public
From: https://www.cnblogs.com/libin159/p/16861476.html

相关文章

  • 装饰模式
    手机功能的升级用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人;而JarPhone除了声音还能振动;更高级的手机(ComplexPhone)除了声音......
  • 外观模式
    计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(Har......
  • 组合模式
    组合模式用透明组合模式实现教材中的“文件夹浏览”这个例子。 类图  java  packagerjsj.no10;publicclassClient{publicstaticvoidmain(St......
  • 18.迭代器模式
    [实验任务一]:JAVA和C++常见数据结构迭代器的使用信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,......
  • 16.命令模式
    [实验任务一]:多次撤销和重复的命令模式某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次undo()和redo()操作,可......
  • 15.职责链模式
    [实验任务一]:财务审批某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单......
  • 简单工厂模式带实战(不属于GOF的23种经典设计模式)
    简单工厂模式带实战(不属于GOF的23种经典设计模式)1、描述简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactoryMethod)模式,但不属于23种GOF设计模式之一。简单......
  • UML建模语言、设计原则、设计模式
    1、UML统一建模语言定义:用于软件系统设计与分析的语言工具目的:帮助开发人员更好的梳理逻辑、思路学习地址:UML概述_w3cschool官网:https://www.omg.org/spec/UML1.1......
  • history模式下页面刷新404问题
      最近在完成实验室oj项目部署时,发现了一个有趣的现象:可以正常进入项目,导航栏上各个组件间也可以正常跳转,但点击页面刷新按钮后,就离奇的出现了404。1、问题分析  ......
  • 23种设计模式-原型设计模式介绍加实战
    1、描述用原型实例指定创建对象的种类,并且通过拷贝这些原型对象的属性来创建新的对象。通俗点的意思就是一个对象无需知道任何创建细节就可以创建出另外一个可定制的对象......