--- title: Javaデザインパターンについて話す tags: Java type: slide slideOptions: theme: white slideNumber: 'c/t' center: false keyboard: true width: '93%' height: '100%' transition: 'slide' --- ## KT#28 Javaデザインパターンについて考える --- ## どうも、外口です 特に面白い話題ないです。誰かください --- ## デザインパターンってなんやねん オブジェクト指向で使われる設計パターン GoF(Gang of Four)とかいうカッケー奴らが作った --- ## GoFが作ったデザインパターンは全23種  --- ## コピペしろよ!的なやつではない あくまでこのパターンを理解して自分のシステムに応用しろよってやつ ### アンチパターン - デザインパターンに合わせて実装 - デザインパターンを可能な限り適用 - 設計時に適用できそうなので絶対使うマン --- ## デザインパターンのPros&Cons ### pros - 拡張性UP - 再利用性UP - 可読性UP - 伝達速度UP ### cons - 既存思想・仕組みとの乖離 - パターン固執による生産性低下 --- ## 今回は... - Factory - Builder - Singleton - Facade の4つを紹介しまーす --- ## Factory インスタンスの作り方をスーパークラスで定め、具体的な処理をサブクラスで実施 生成するオブジェクトごとにファクトリを用意し、オブジェクトの生成処理を行う --- ## Factoryの使いみち ```java:Factory.java // このクラスでインスタンスの作り方を定義 abstract class Factory { public final Product create(String owner) { Product product = createProduct(owner); registerProduct(product); return product; } abstract Product createProduct(String owner); abstract void registerProduct(Product product); } ``` ```java=CarFactory public class CarFactory extends Factory { Product createProduct(String owner) { return new Car(owner); } void registerProduct(Product product) { Car car = (Car)product; String owner = car.getOwner(); owners.add(owner); } } ``` --- ## Builder オブジェクトの生成処理を積み上げてインスタンスを生成するパターン 複数のコンストラクタ初期設定による複雑さを防ぐ オブジェクトとその生成ロジックを分離するとイイヨ!ってやつ --- ## Builderの使いみち ```java:People.java // 今回はLombok Builderを使います // ↓のアノテーションがあるだけでオブジェクトの生成を他に任せられる @Builder class People { @NonNull private String name; @Nonnull private int age; private String hobby; } ``` ```java:PeopleFactory.java // Peopleの生成クラスがどこかにあるとする class PeopleFactory { ... public People build(String name, int age, String hobby) { return People.builder(). .name(name) .age(age) .hobby(hobby) .build(); } } ``` --- ## Singleton そのクラスのインスタンスは常に1つしか存在しない状態を作る システム内で1つでいいときとかに使う --- ## Singleton使いみち ```java=Singleton.java class Singleton { private static Singleton singleton = new Singleton(); // プライベートコンストラクタは必須 private Singleton() {} // getterを呼び出して1つだけ使うようにする public static Singleton getInstance() { return singleton; } } ``` ```java=Hoge.java class Hoge { Singleton single1 = Singleton.getInstance(); Singleton single2 = Singleton.getInstance(); single1 == single2; // true } ``` --- ## Facade ふぁさーど 処理を依頼する側に「窓口」となるインターフェースを用意してあげる いわば既存ライブラリを駆使した新ライブラリ作るようなもん  --- ## 正直全部覚えるのはムリ 使えそうなら使ったろくらいの意気込みでいればいいと思ってる 他言語でデザインパターンあれば教えて下さい
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up