---
title: 【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう(Adapter・Factory Method・Singleton)
tags:  #designpatterns  
author: [k-abe@組み込みソフトウェアの人](https://www.docswell.com/user/juraruming)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/L71KNQYNEG.jpg?width=480
description: 2024/10/25 社内勉強会の資料 より良い設計を目指すための小話、Adapter、Factory Method、Singletonをテーマにしている。
published: October 25, 24
canonical: https://www.docswell.com/s/juraruming/5QRMXX-2024-10-25-142836
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/L71KNQYNEG.jpg)

【連続講座1】デザインパターンを学
び、ソフトウェア設計に生かそう
・Factory Method・Singleton
パーソルクロステクノロジー株式会社
エンジニアリング事業管掌 設計統括本部
第2電子・制御設計本部 第1設計部 4G 阿部耕二
Adapter


# Page. 2

![Page Image](https://bcdn.docswell.com/page/G7WD4M1ME2.jpg)

目次
自己紹介
開発環境構築
設計、してますか?
良い設計とはどういう設計か?
デザインパターンの学び方のススメ
Adapter
Factory Method
Singleton
参考資料
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/4JZG2QPM73.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
自己紹介
名前: 阿部 耕二（あべ こうじ）
所属: パーソルクロステクノロジー株式会社
エンジニアリング事業管掌 設計統括本部
第2電子・制御設計本部 第1設計部 4G
医療機器の組込みソフトウェア開発。C言語。
趣味: 宇宙開発（リーマンサットプロジェクト広報メンバー）
LAPRAS ポートフォリオ : https://lapras.com/public/k-abe
Twitter: @juraruming
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/YE6YV6M5JV.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
開発環境構築
サンプルコードのコンパイル、実行にjava（JDK）のインストールが
必要です。
下記のページなどを参照し、ご自分のPCのOSに合わせてインストー
ルしてください。
【2024年版】Java JDKのインストール方法（Windows &amp; Mac対応）
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/GE5GD6ZGE4.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
つぎのコマンド実行でバージョンが表示されていればOKです。
私はつぎのバージョンで確認しました。
$ javac -version
javac 17.0.8
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/972Y8MRD7R.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
サンプルプログラムのビルド方法
サンプルプログラムのディレクトリ（Main.javaがあるディレクトリ）
に移動しつぎのコマンドでビルドする。
$ javac Main.java
プログラムの実行はつぎのコマンドで行う。
$ java Main
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/DJYG6XDMJM.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
講座のGitHubリポジトリ
https://github.com/grace2riku/design_pattern_lesson
今回の講座のディレクトリ
https://github.com/grace2riku/design_pattern_lesson/tree/main/le
sson_1
参考資料1 ソースコードのダウンロード先
Java 言語で学ぶデザインパターン入門 第 3 版
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/V7NGZ163E8.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
設計、してますか?
設計してますか?
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/YJ9WZ5LPJ3.jpg)

【連続講座1】デザインパターンを学び、ソフトウェ
こんなことになってませんか?
おばあちゃんのプログラミン
グ教室（ばあプロ）As A
Service @Pythonist19 より引
用
https://x.com/Pythonist19/sta
tus/1845794841269055543
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/GJ8N1YXXED.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
設計の重要性
要素技術にフォーカスしがち、注力しがち
→ 再利用しにくい、変更しにくいソフトウェアのできあがり
他社との違い・自社の強みを活かしていないソフトウェアが誕生
ビジネス競争力の低下 → 技術的負債に!!!
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/LJLPQ48NER.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
設計の難しさ
お手本がない。
対象製品、装置で個別の事情がある。
製品の特性、開発期間、製品寿命、etc
Web システムと組込みソフトウェア
自動車と医療機器では設計思想も違ってきそう。
自動車：変化が早い、開発期間短い、大量生産
医療機器：開発期間長い印象、少量生産
ソフトウェアは柔軟で、自由度が高すぎる。
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/47M41K6QEW.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
対象システム、装置に応じた設計手法を学び、身につける
そしてチームメンバーと共通認識を持ちたい。
デザインパターン
設計の古典、教科書ともいえる。
プログラミング言語の中に取り込まれて、見えない。
→ 学ぶことは意味があると考える。
→ 開発時のコミュニケーションに活用する。
ここは「xxx」パターンを適用してみようか?
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/P7RWLXPKE9.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
良い設計とはどういう設計か?
良い設計のために個人的に大事だと思うキーワード
1. 凝集度
2. 結合度
3. 関心の分離
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/PJXPW635EX.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
1.
凝集度
関心ごとの集まり
凝集度が高い方（関心ごとが一箇所に集まっている）が良い設計と
言われる
1 つの目的・責務になっていることが望ましい
例）料理を作る場面
キッチン周りには料理に必要な設備が配置される（水道、冷蔵庫、コ
ンロ、食器棚、その他）。
→必要なものが凝集している状態
キッチン周りに洗濯機はいらない。料理をつくるという関心ごとに洗
濯機は不要。
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/3JKDV1YR7D.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
2.
結合度
他のモジュールとの関連の度合い
結合度が低い方（他のモジュールとの関連が少ない方）が良い設計
と言われる
あるファイルのグローバル変数が他の複数のファイルから参照され
ている状況は結合度が低い。
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/LE3RMQ9G75.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
関心の分離
関心ごとを分離し、境界を設ける
関心の分離が表現されている例としてOSI参照モデル・TCP/IPに注
目する
“ 画像引用元
OSI 参照モデルとは？ TCP/IP との違いを図解で解説
“
3.
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/8EDY69GNEG.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
役割ごとに階層が分かれている
下の層がハードウェアに近い
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/V7P6YZ3NJ8.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/2JV3GW4YEQ.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
上の階層ほど抽象的。目的・知識・Why。
下の階層ほど具体的。目的を達成する手段・How。
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/5EG38D1W7L.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
デザインパターンの学び方のススメ
デザインパターンがどんな課題を解決できて、どのような構成なの
かイメージを捉える
参考資料1の章題はデザインパターンを短く端的に表現してい
る。
参考資料3では各デザインパターンを短く、わかりやすく解説し
てくれている。
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/4JQ591DQ7P.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
クラス図とコードの写経をセットで行う
コードだけ見ていても各クラスの全体の関係性がわかりずらい。
クラス図だけを見ていても抽象的で本当に動くのか疑問がわく。
設計図（抽象） ⇔ コード（具体的）の世界を行ったり来たり
することで整理できたり、気づきが得られることがあると思う。
今回のサンプルコードはJava。デザインパターンの考え方・実装
は特定のプログラミング言語に限定されないと思うので自分が得
意な言語で実装してみると理解が深まると思う。
参考資料2ではC#、 C++、 Go、 Java、 PHP、 Python、 Ruby、
Rust 、 Swift 、 TypeScript で実装例を提示してくれている。
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/K749XRZYE1.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
デザインパターンに登場するクラスの相互関係に注目する
複数のクラスが関係してパターンを構成している。各クラスの役
割、関係性に注目する。
デザインパターンがどのように振る舞うか?に加えて、デザインパタ
ーンはどのように使われるか?の視点も大事だと思う。
22


# Page. 23

![Page Image](https://bcdn.docswell.com/page/LJ1KNQRN7G.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
Adapter
参考資料1 章題 【一皮かぶせて再利用】
すでに提供されているものがそのまま使えないときに、必要な形に
変換してから利用する
パソコンのACアダプター（直流12Vで動く製品とする）
提供されているもの -&gt; 交流100V
AC アダプタが変換するもの -&gt; 交流を直流に変換。交流 100V をパソ
コンが動作する12Vに変換する
23


# Page. 24

![Page Image](https://bcdn.docswell.com/page/GJWD4MYM72.jpg)

【連続講座1】デザインパターンを学び、ソフトウェ
例）Apple ACアダプタ
Apple の AC アダプタの構造
24


# Page. 25

![Page Image](https://bcdn.docswell.com/page/4EZG2QXMJ3.jpg)

【連続講座1】デザインパターンを学び、ソフトウェ
アダプタのプラグ部分は取り
外し可能で海外でも使えるよ
うに考慮されている（設計し
た）と予想できる。
調べてみたらApple ワールド
トラベルアダプタキットなる
製品があり、7種類のプラグ形
状があることがわかった。
プラグ部分を容易に変更でき
る構造になっている。
このように容易に変更できる
構造をソフトウェアにも持ち
込みたい!!!
25


# Page. 26

![Page Image](https://bcdn.docswell.com/page/Y76YV645EV.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
パターンのサンプルプログラム例
テーマ：既にある加算に下限・上限の制限を追加する。
例えば、下限O、上限100のときに加算の計算結果が上限値を超えた
ら上限値の100にする。
加算の計算結果が下限値を下回ったら下限値の0に固定する。
表 電源の比喩とサンプルプログラムの対応関係
\
電源の比喩 サンプルプログラム
提供されているもの 交流100ボルト Calcクラス
変換装置
アダプター LimitCalcクラス
必要なもの
直流12ボルト Limiterクラス
Adapter
26


# Page. 27

![Page Image](https://bcdn.docswell.com/page/G75GD6QG74.jpg)

【連続講座1】デザインパターンを学び、ソフトウェ
サンプルプログラムのクラス図
サンプルプログラムのディレク
トリ
https://github.com/grace2riku
/design_pattern_lesson/tree/
main/lesson_1/adapter/LimitC
alc
27


# Page. 28

![Page Image](https://bcdn.docswell.com/page/9J2Y8MPDJR.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
サンプルプログラムのビルド方法
サンプルプログラムのディレクトリ（Main.javaがあるディレクトリ）
に移動しつぎのコマンドでビルドする。
$ javac Main.java
プログラムの実行はつぎのコマンドで行う。
$ java Main
28


# Page. 29

![Page Image](https://bcdn.docswell.com/page/DEYG6X5MEM.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
Adapter
サンプルプログラムの実行結果
$ java Main
/***** Calc *****/
ret_val(0 + 101) = 101
ret_val(0 + (-1)) = -1
/***** LimitCalc *****/
limit min value = 0/limit max value = 100
ret_val(0 + 50) = 50
ret_val(0 + 100) = 100
ret_val(0 + 101) = 100
ret_val(0 + 0) = 0
ret_val(0 + (-1)) = 0
はリミットなしの加算。LimitCalcはリミットありの加算
LimintCalc の下限は 0 、上限は 100 に設定
Calc
29


# Page. 30

![Page Image](https://bcdn.docswell.com/page/VJNGZ1N378.jpg)

【連続講座1】デザインパターンを学び、ソフトウェ
パターンの登場人物を
抽象的に書く
Adapter
30


# Page. 31

![Page Image](https://bcdn.docswell.com/page/YE9WZ5RPE3.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
パターンの使いところ
既にあるクラスを変更せずに再利用できる
変動部（Target）をバリエーション化すれば素早く多くのバリエー
ションに対応できる（競合他社との差別化）
Adapter
31


# Page. 32

![Page Image](https://bcdn.docswell.com/page/GE8N1YWX7D.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
Factory Method
参考資料1 章題 【インスタンス作成をサブクラスにまかせる】
インスタンス作成するクラスを用意する（あちこちでインスタン作
成せずに、インスタンス作成役に任せる）。
32


# Page. 33

![Page Image](https://bcdn.docswell.com/page/LELPQ4NN7R.jpg)

【連続講座1】デザインパターンを学び、ソフトウェ
サンプルプログラムのクラス図
サンプルプログラムのディレク
トリ
https://github.com/grace2riku
/design_pattern_lesson/tree/
main/lesson_1/Factory_Meth
od
33


# Page. 34

![Page Image](https://bcdn.docswell.com/page/4JM41KXQ7W.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
サンプルプログラムのビルド方法
サンプルプログラムのディレクトリ（Main.javaがあるディレクトリ）
に移動しつぎのコマンドでビルドする。
$ javac Main.java
プログラムの実行はつぎのコマンドで行う。
$ java Main
34


# Page. 35

![Page Image](https://bcdn.docswell.com/page/PJRWLXNK79.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
Adapter
サンプルプログラムの実行結果
$ java Main
/***** IDCardのFactory *****/
Hiroshi Yukiのカードを作ります。
IDCard [owner=Hiroshi Yuki]を登録しました。
Tomuraのカードを作ります。
IDCard [owner=Tomura]を登録しました。
Hanako Satoのカードを作ります。
IDCard [owner=Hanako Sato]を登録しました。
IDCard [owner=Hiroshi Yuki]を使います。
IDCard [owner=Tomura]を使います。
IDCard [owner=Hanako Sato]を使います。
/***** BussinesCardのFactory *****/
Koji Abeの名刺を作ります。
BusinessCard [owner=Koji Abe]を登録しました。
Riku Abeの名刺を作ります。
BusinessCard [owner=Riku Abe]を登録しました。
BusinessCard [owner=Koji Abe]を使います。
BusinessCard [owner=Riku Abe]を使います。
35


# Page. 36

![Page Image](https://bcdn.docswell.com/page/PEXPW6N57X.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
サンプルプログラムの実行結果
IDCard の Factory は参考資料 1 のサンプルコード
BussinesCard の Factory は今回追加した名刺の Factory と商品の名刺
フレームワークのパッケージ内は変更せず、具体的な工場・商品の
追加で新しい種類のインスタンス作成ができた
Adapter
36


# Page. 37

![Page Image](https://bcdn.docswell.com/page/3EKDV1NRJD.jpg)

【連続講座1】デザインパターンを学び、ソフトウェ
パターンの登
場人物を抽象的に書く
Factory_Method
37


# Page. 38

![Page Image](https://bcdn.docswell.com/page/L73RMQVGJ5.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
パターンの使いところ
インスタンス生成を専門にするクラスを用意することでコードを整
理できる
工場に使えばインスタンスを作成できる。
Factory_Method
38


# Page. 39

![Page Image](https://bcdn.docswell.com/page/87DY698N7G.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
static Factory Method
参考資料1より引用
インスタンス生成のためのクラスメソッド（クラスをインスタンス
化しなくても呼び出し可能なメソッド）
GoF の Factory Method パターン違うが、インスタンス生成でよく使
われる手法。
（個人的に開発シーンでFactoryと呼ぶときはこちらを指すことが
多いと思っている）
“
“
39


# Page. 40

![Page Image](https://bcdn.docswell.com/page/VJP6YZ8NE8.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
static Factory Method
のAPIのstatic Factory Methodとして参考資料1で紹介されてい
るものは以下のとおり
java.security.SecureRandom の getInstance メソッド
java.util.List の of メソッド
java.util.Arrays の asList メソッド
java.lang.String の valueOf メソッド
java.time.Instant の now メソッド
java
40


# Page. 41

![Page Image](https://bcdn.docswell.com/page/2EV3GWNY7Q.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
Singleton
参考資料1 章題 【たった1つのインスタンス】
システムにインスタンスが1つしかないことを保証する。
プログラマがインスタンスを1つしかつくらないように気を付ける
のではなく、インスタンスが1つしかつくれないような仕組みにす
る。
41


# Page. 42

![Page Image](https://bcdn.docswell.com/page/57G38DKWJL.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
システムの中で複数あると困りそうなもの
プリンタのジョブ管理
デバイスドライバ
Factory Method の Factory
42


# Page. 43

![Page Image](https://bcdn.docswell.com/page/4EQ591NQJP.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
パターンのサンプルプログラム例
テーマ：システムに1つのものを対象にする。今回はプリンタのジョブ
Singleton
43


# Page. 44

![Page Image](https://bcdn.docswell.com/page/KJ49XRGY71.jpg)

【連続講座1】デザインパターンを学び、ソフトウェ
サンプルプログラムのクラス図
サンプルプログラムのディレク
トリ
https://github.com/grace2riku
/design_pattern_lesson/tree/
main/lesson_1/Singleton/Prin
tJob
44


# Page. 45

![Page Image](https://bcdn.docswell.com/page/LE1KNQDNJG.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
サンプルプログラムのビルド方法
サンプルプログラムのディレクトリ（Main.javaがあるディレクトリ）
に移動しつぎのコマンドでビルドする。
$ javac Main.java
プログラムの実行はつぎのコマンドで行う。
$ java Main
45


# Page. 46

![Page Image](https://bcdn.docswell.com/page/GEWD4M8MJ2.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
Singleton
サンプルプログラムの実行結果
$ java Main
Start.
インスタンスを生成しました。
printjob1とprintjob2は同じインスタンスです。
End.
「インスタンスを生成しました。」のメッセージが1つなので、イン
スタンスは1つのみ生成されている。
getInstance メソッドで取得したインスタンスは同じことを確認でき
た
46


# Page. 47

![Page Image](https://bcdn.docswell.com/page/47ZG2Q8ME3.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
パターンの使いところ
インスタンスが1つであることを保証したい時
組込みソフトウェアのデバイスドライバなど。
データベースのアクセス
Factory Method の Factory （インスタンスを作成する工場はひと
つでよいことが多いと思う）
Singleton
47


# Page. 48

![Page Image](https://bcdn.docswell.com/page/YJ6YV6P57V.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
おまけ：Singletonの実装を変更してみる
サンプルコード：
https://github.com/grace2riku/design_pattern_lesson/tree/main/less
on_1/Singleton/PrintJob_2_1
48


# Page. 49

![Page Image](https://bcdn.docswell.com/page/GJ5GD6KGJ4.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
ディレクトリ名：PrintJob_2_1
Singleton のインスタンス生成の実装を下記に変更（インスタンスが生
成済みかnullチェックするようにした）
public class PrintJob {
private static PrintJob printJob = null;
private PrintJob() {
System.out.println(&quot;インスタンスを生成しました。&quot;);
}
public static PrintJob getInstance() {
if (printJob == null) {
printJob = new PrintJob();
}
return printJob;
}
}
49


# Page. 50

![Page Image](https://bcdn.docswell.com/page/LE3RMQZP75.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
サンプルコード：PrintJob_2_1を動かすとSingletonの動きが確認でき
ます。
・・・確認できますが、このコードには
考慮していないこと
呼び出し方にはよっては意図しない動作をする可能性
があります。
それは何でしょう？
つぎのページを見ずに考えてみてくださいね
50


# Page. 51

![Page Image](https://bcdn.docswell.com/page/8EDY69R3EG.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
前ページの解答
マルチスレッド環境でgetInstanceを実行すると異なるインスタンス
を取得してしまう（Singletonでなくなる）
51


# Page. 52

![Page Image](https://bcdn.docswell.com/page/V7P6YZWPJ8.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
をマルチスレッドで実行するように変更したコード
（
）で動きを確かめてみる
サンプルコード：
PrintJob_2_1
PrintJob_2_2
https://github.com/grace2riku/design_pattern_lesson/tree/main/less
on_1/Singleton/PrintJob_2_2
52


# Page. 53

![Page Image](https://bcdn.docswell.com/page/2JV3GW8VEQ.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
PrintJob_2_2
をコンパイル・実行するとつぎの結果になる。
Start
End
インスタンスを生成しました。
インスタンスを生成しました。
インスタンスを生成しました。
PrintJob B: obj = PrintJob@1151bbe3
PrintJob C: obj = PrintJob@7b63961c
PrintJob A: obj = PrintJob@4230a45b
つインスタンスをつくっており、異なるインスタンスになってい
る。
※PC環境によっては結果が異なるかもしれません。私のPCだと毎
回異なるインスタンスになりました。
3
53


# Page. 54

![Page Image](https://bcdn.docswell.com/page/5EG38D517L.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
何故、Singletonでなくなったのでしょうか?
54


# Page. 55

![Page Image](https://bcdn.docswell.com/page/4JQ591ZN7P.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
Q.
A.
何故、Singletonでなくなったのでしょうか?
このメソッドの条件判断がマルチスレッドで実行されるため
public static PrintJob getInstance() {
if (printJob == null) {
printJob = new PrintJob();
}
return printJob;
}
55


# Page. 56

![Page Image](https://bcdn.docswell.com/page/K749XR33E1.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
のコードでSingletonに対応する方法
インスタンス作成部分をマルチスレッド環境から呼び出されても唯一
のインスタンスを返すようにする。
参考資料1に書かれていた手法を紹介する。
コード
PrintJob_2_2
https://github.com/grace2riku/design_pattern_lesson/tree/main/less
on_1/Singleton/PrintJob_2_3
56


# Page. 57

![Page Image](https://bcdn.docswell.com/page/LJ1KNQ1Z7G.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
synchronized
を付加する
public static synchronized PrintJob getInstance() {
if (printJob == null) {
printJob = new PrintJob();
}
return printJob;
}
57


# Page. 58

![Page Image](https://bcdn.docswell.com/page/GJWD4M8672.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
PrintJob_2_3
（synchronized）の実行結果
$ java Main
Start
End
インスタンスを生成しました。
PrintJob B: obj = PrintJob@386514c2
PrintJob A: obj = PrintJob@386514c2
PrintJob C: obj = PrintJob@386514c2
インスタンスが1個だけ作成されており、Singleton対応できている
ことが確認できた。
PrintJob_2_1 のコードが基本形だと思う。
PrintJob_2_1 のコードをマルチスレッド環境で実行しても Singleton
対応できている。
58


# Page. 59

![Page Image](https://bcdn.docswell.com/page/4EZG2Q8RJ3.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
このことから学べるポイント
どう使われるか?、どう使われる可能性があるか?、を考慮して実装
者に任せるのではなく設計者が実装者に伝えるようにする。
スレッドセーフではない実装のまま進める場合は、ドキュメントに
スレッドセーフではない旨を書いておいた方が良さそう。
59


# Page. 60

![Page Image](https://bcdn.docswell.com/page/Y76YV6P1EV.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
参考資料
言語で学ぶデザインパターン入門 第3版
2. 直撃！デザインパターン
3. ぼくにもわかるデザインパターン 第 2 章 GoF パターン大カタログ
～パターンがみるみる頭にしみこむ～
1. Java
60


# Page. 61

![Page Image](https://bcdn.docswell.com/page/G75GD6KL74.jpg)

【連続講座1】デザインパターンを学び、ソフトウェア設計に生かそう
ご清聴ありがとうございました
61


