生産者・ブローカ・消費者のシミュレーション

戻る
<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Cygwin (vers 1st September 2004), see www.w3.org" />
<title>SIMULATION</title>
</head>
<body>
<!-- デフォルトのセキュリティポリシーから、FactoryAutomation.jar,Basis.jarは同一ディレクトリに配置する -->
<applet code="FactoryAutomation" archive="FactoryAutomation.jar,Basis.jar"
 width="800" height="600"></applet>
</body>
</html>


::::::::::::::
Actor.java
::::::::::::::
/**
$Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
*/

abstract public class Actor {
    protected double fund;
    protected String name;

    public Actor( String name ) {
        this.name = name;
    }

    public void setFund( double fund ) {
        this.fund = fund;
    }

    protected double getFund() {
        return fund;
    }
}
::::::::::::::
Broker.java
::::::::::::::
/**
$Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
*/

public class Broker extends Actor implements Drawable {

    private Stock stock;
    private String name;

    public Broker( String name ) {
        super( name );
    }

    public void buy( Product product ) {}

}
::::::::::::::
Drawable.java
::::::::::::::
/**
$Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
*/

public interface Drawable {}
::::::::::::::
DrawingPanel.java
::::::::::::::
import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

import java.io.*;

import BasicPackage.*;

/**
$Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
@author KISHI Yasuhiro
*/

public class DrawingPanel extends AbstractDrawingPanel {

    public DrawingPanel() {
        super();
        start( 100 );
    }

    public void setActors() {}
    public void drawActors( Graphics g ) {}

    public void paintComponent( Graphics g ) {
        clearScreen( g );
    }

}

::::::::::::::
FactoryAutomation.java
::::::::::::::
import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

import BasicPackage.*;

/**
* $Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class FactoryAutomation extends AbstractJApplet {

    public FactoryAutomation() {
        setPanel( new DrawingPanel(), 800, 600 );

        init();
    }

}

::::::::::::::
GardenStuff.java
::::::::::::::
/**
* <pre>野菜</pre>
* $Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class GardenStuff extends Product {
    private final double cost = 5.0;

    public GardenStuff( Producer producer ) {
        super( producer );
    }

    /** 現在の製造コストを返す */
    public double getCost() {
        return cost * ProductingCostManager.getCurrentRate();
    }

}
::::::::::::::
Meat.java
::::::::::::::
/**
* <pre>食肉</pre>
* $Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
* 
*/

public class Meat extends Product {

    private final double cost = 10.0;

    public Meat( Producer producer ) {
        super( producer );
    }

    /** 現在の製造コストを返す */
    public double getCost() {
        return cost * ProductingCostManager.getCurrentRate();
    }

    static public void main( String[] args ) {

        Meat meat = new Meat( new Producer( "山田さん" ) );

        System.out.printf( "%5.2f\n", meat.getCost() );

    }
}
::::::::::::::
Producer.java
::::::::::::::
/**
$Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
*/

public class Producer extends Actor implements Drawable {
    /** 在庫 */
    private Stock stock;
    /** 在庫数の許容最大値(とりあえず固定値) */
    private final int STOCK_SIZE = 10;

    /** 名前 */
    private String name;

    public Producer( String name ) {
        super( name );
        stock = new Stock( STOCK_SIZE );
    }

    public synchronized void produce() {

        if ( !stock.isAcceptable() ) {
            System.out.println( "これ以上在庫を増やすことは出来ません。" );
            return ;

        }

        // 市場の動向に従い生産物を決める
        Product product = ( Product ) TrendInformationProvider.notifyHotSellingProduct( this );

        /**
        if( product instanceof Meat){
        	
        }
        */

        if ( ! canAffordToProduce( product.getCost() ) ) {
            System.out.println( "もう資金に余裕がありません!" );
            return ;
        }

        System.out.printf( "%30s を生産しました! -- 製造コスト=%6.2f\n", product.getClass().getName(), product.getCost() ) ;
        stock.store( product );
        spendMoney( product.getCost() );

    }

    /** 資金を使う */
    private void spendMoney( double cost ) {
        fund -= cost;
    }

    /** 生産するための資金に余裕があるか */
    private boolean canAffordToProduce( double cost ) {
        return ( fund >= cost );
    }

    /** 生産物をブローカに販売する */
    public void sellProduct( Broker broker ) {}

    static public void main( String[] args ) throws Throwable {

        Producer producer = new Producer( "大山さん" );
        producer.setFund( 100.0 );

        for ( int i = 0;i < 15;i++ ) {
            producer.produce();
            System.out.printf( "現在の資金残高=%6.2f\n", producer.getFund() );

            try {
                Thread.sleep( 500 );
            } catch ( Throwable t ) {
                throw t;
            }
        }

        System.out.println( "-------------------------------------------------------------------" );

        Producer producer2 = new Producer( "藤田さん" );
        producer2.setFund( 40.0 );

        for ( int i = 0;i < 15;i++ ) {
            producer2.produce();
            System.out.printf( "現在の資金残高=%6.2f\n", producer2.getFund() );

            try {
                Thread.sleep( 500 );
            } catch ( Throwable t ) {
                throw t;
            }
        }
    }
}
::::::::::::::
Product.java
::::::::::::::
/**
$Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
*/

abstract public class Product {
    protected Producer producer;

    public Product( Producer producer ) {
        this.producer = producer;
    }

    /**
    * 季節によりコストが変更するものとする 
    */
    abstract double getCost();
}
::::::::::::::
ProductingCostManager.java
::::::::::::::
/**
* $Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
* 製造コストの季節変動の割合を返す
*/

public class ProductingCostManager {

    static public double getCurrentRate( ) {

        // ロジックはあとで変更する

        if ( System.currentTimeMillis() % 5 == 0 ) {
            return 1.25;
        } else {
            return 1.00;
        }
    }

}
::::::::::::::
Stock.java
::::::::::::::
import java.util.*;
import java.util.concurrent.*;

/**
$Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
*/

public class Stock implements Storable {

    private int size;
    private ArrayBlockingQueue queue;

    public Stock( int size ) {
        this.size = size;
        queue = new ArrayBlockingQueue( size );
    }

    /** キューにデータを格納する */
    public void store( Object obj ) {
        boolean status = queue.offer( obj );

    }

    /** キューからデータを取り出す */
    public Object pickup() throws Throwable {
        Object object;
        try {
            object = queue.take();
        } catch ( Throwable t ) {
            throw t;
        }

        return object;
    }

    /** 追加可能かどうか */
    public boolean isAcceptable() {
        System.out.println( "現在の在庫数=" + queue.size() + " : 許容サイズ=" + size );
        return ( queue.size() != size );
    }

}
::::::::::::::
Storable.java
::::::::::::::
/**
$Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
*/

public interface Storable {

    /** 格納する */
    public void store( Object obj );
    /** 取り出す */
    public Object pickup() throws Throwable;
}
::::::::::::::
TrendInformationProvider.java
::::::::::::::
/**
$Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
*/

public class TrendInformationProvider {

    static public Product notifyHotSellingProduct( Producer producer ) {

        // ロジックはあとで変更する

        if ( System.currentTimeMillis() % 3 == 0 ) {
            return new Meat( producer );
        } else {
            return new GardenStuff( producer );

        }

    }
}

::::::::::::::
AbstractDrawingPanel.java
::::::::::::::
package BasicPackage;

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

import java.io.*;
import java.util.*;

/**
$Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
@author KISHI Yasuhiro
*/

abstract public class AbstractDrawingPanel extends JPanel implements Runnable {

    /** 描画対象となるオブジェクトを格納するList */
    protected java.util.List actors;

    protected long sleepTime;

    public AbstractDrawingPanel() {

        setActors();

    }

    protected void start( long sleepTime ) {
        this.sleepTime = sleepTime;

        /***************************************************************************************/
        /** ThreadクラスはRunnableインタフェースで実装されているクラスをrunさせることができる **/
        /***************************************************************************************/
        Thread thread = new Thread( this );
        thread.start();

    }

    abstract public void setActors();
    abstract public void drawActors( Graphics g );

    public void run() {
        while ( true ) {

            SwingUtilities.invokeLater(
                new Runnable() {
                    public void run() {
                        repaint();
                    }
                }
            );

            try {
                Thread.sleep( sleepTime );
            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }

    abstract public void paintComponent( Graphics g );

    protected void clearScreen( Graphics g ) {
        int width = getWidth();
        int height = getHeight();

        // 画面クリア
        g.setColor( Color.black );
        // このコンポーネントのサイズを取得する
        g.fillRect( 0 , 0 , width , height );
    }


}

::::::::::::::
AbstractJApplet.java
::::::::::::::
package BasicPackage;

import javax.swing.*;

import java.awt.*;
import java.awt.event.*;

/**
* 後でおそらく抽象メソッドが必要になってくるの抽象クラスにしておく
* $Id: FA.html,v 1.1 2009/06/22 16:11:42 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

abstract public class AbstractJApplet extends JApplet {

    protected AbstractDrawingPanel panel;

    protected void setPanel( AbstractDrawingPanel panel, int width, int height ) {
        this.panel = panel;
        panel.setPreferredSize( new Dimension( width , height ) );
    }

    public void init() {

        Container contentPane = getContentPane();
        contentPane.setLayout( new FlowLayout() );

        contentPane.add( panel );
    }

}


戻る inserted by FC2 system