デザインパターン#
1. シンプルファクトリーパターン#
シンプルファクトリーパターン:静的ファクトリーパターン
static: クラスのメンバー変数、メンバーメソッド。オブジェクトを作成する必要がなく、クラス名で呼び出す;クラスのすべてのオブジェクトが共同で所有する
例外をスローする Exception // カスタム例外、成績管理 1-100、1-100 以外は例外をキャッチする必要がある
Java では throws はメソッド宣言の場所に置かれ、このメソッドが例外をスローする可能性があることを示す
throw: コード内で例外をスローする
属性に protected または private がない場合、デフォルトのアクセス権は package であり、同じパッケージ内でアクセスできる。
private < package < protected < public。protected は継承に使用され、親クラスで使用される。
デフォルトの権限と protected の違いはパッケージ間にある。
サブクラスは親クラスの protected(非パッケージサブクラス)にアクセスできる。
インターフェースのメソッドはデフォルトで public abstract void fly () である。
1.1 反面コード#
package simpleFactory.negative;
abstract class Weapon{
abstract void display();
}
class MachineGun extends Weapon{
@Override
void display() {
// TODO Auto-generated method stub
System.out.println("機関銃");
}
}
class Pistol extends Weapon{
@Override
void display() {
// TODO Auto-generated method stub
System.out.println("ピストル");
}
}
public class DemoN {
public static void main(String[] args) {
Weapon w1=new MachineGun();
w1.display();
Weapon w2=new Pistol();
w2.display();
}
/**
* クライアントは具体的なサブクラス名だけを持つ必要があり、ユーザーのプログラミングの難易度を上げる
*/
}
1.2 正面コード#
package simpleFactory.negative;
abstract class Weapon{
abstract void display();
}
class MachineGun extends Weapon{
@Override
void display() {
// TODO Auto-generated method stub
System.out.println("機関銃");
}
}
class Pistol extends Weapon{
@Override
void display() {
// TODO Auto-generated method stub
System.out.println("ピストル");
}
}
public class DemoN {
public static void main(String[] args) {
Weapon w1=new MachineGun();
w1.display();
Weapon w2=new Pistol();
w2.display();
}
/**
* クライアントは具体的なサブクラス名だけを持つ必要があり、ユーザーのプログラミングの難易度を上げる
*/
}
2. ファクトリーメソッドパターン#
2.1 反面コード#
package factory.negative;
abstract class Weapon{
abstract void diaplay();
}
class MachineGun extends Weapon{
@Override
void diaplay() {
// TODO Auto-generated method stub
System.out.println("機関銃");
}
}
class Pistol extends Weapon{
@Override
void diaplay() {
// TODO Auto-generated method stub
System.out.println("ピストル");
}
}
class SniperRifle extends Weapon{
@Override
void diaplay() {
// TODO Auto-generated method stub
System.out.println("狙撃銃!");
}
}
class WeaponFactory{
public static Weapon creatWeapon(String type) {
Weapon w=null;
switch(type) {
case "ピストル":
w=new Pistol();
break;
case "機関銃":
w=new MachineGun();
break;
case "狙撃銃":
w= new SniperRifle();
break;
default:
System.out.println("この武器は生産できません:"+type);
}
return w;
}
}
public class DemoN {
public static void main(String[] args) {
Weapon pistol=WeaponFactory.creatWeapon("ピストル");
pistol.diaplay();
Weapon machineGun=WeaponFactory.creatWeapon("機関銃");
machineGun.diaplay();
Weapon sr=new SniperRifle();
sr.diaplay();
}
}
2.2 正面コード#
package factory.positive;
abstract class Weapon{
abstract void diaplay();
}
class MachineGun extends Weapon{
@Override
void diaplay() {
// TODO Auto-generated method stub
System.out.println("機関銃");
}
}
class Pistol extends Weapon{
@Override
void diaplay() {
// TODO Auto-generated method stub
System.out.println("ピストル");
}
}
class SniperRifle extends Weapon{
@Override
void diaplay() {
// TODO Auto-generated method stub
System.out.println("狙撃銃!");
}
}
interface WeaponFactory{
Weapon createWeapon();
}
class MachineGunFactory implements WeaponFactory{
@Override
public Weapon createWeapon() {
// TODO Auto-generated method stub
return new MachineGun();
}
}
class SniperRifleFactory implements WeaponFactory{
@Override
public Weapon createWeapon() {
// TODO Auto-generated method stub
return new SniperRifle();
}
}
class PistolFactory implements WeaponFactory{
@Override
public Weapon createWeapon() {
// TODO Auto-generated method stub
return new Pistol();
}
}
public class DemoP {
public static void main(String[] args) {
WeaponFactory wf1=new MachineGunFactory();
Weapon w1=wf1.createWeapon();
w1.diaplay();
WeaponFactory wf2=new PistolFactory();
Weapon w2=wf2.createWeapon();
w2.diaplay();
WeaponFactory wf3=new SniperRifleFactory();
Weapon w3=wf3.createWeapon();
w3.diaplay();
}
}
3. 抽象ファクトリーパターン#
3.1 反面#
package abstractFactory.negative;
abstract class Weapon{
abstract void diaplay();
}
/**
* ファクトリーメソッドパターンを使用して抽象ファクトリーパターンを使用しない、現代の工場では生産ラインを追加する必要がある——弾薬クラス Bullet
*
* @author ASUS
*
*/
abstract class Bullet{
abstract void display();
}
/**
* 弾薬クラス
* @author ASUS
*
*/
class PistolBullet extends Bullet{
@Override
void display() {
// TODO Auto-generated method stub
System.out.println("ピストル弾");
}
}
class MachineGunBullet extends Bullet{
@Override
void display() {
// TODO Auto-generated method stub
System.out.println("機関銃弾");
}
}
//弾薬工場
interface BulletFactory{
Bullet creatBullet();
}
class MachineGun extends Weapon{
@Override
void diaplay() {
// TODO Auto-generated method stub
System.out.println("機関銃");
}
}
class Pistol extends Weapon{
@Override
void diaplay() {
// TODO Auto-generated method stub
System.out.println("ピストル");
}
}
class SniperRifle extends Weapon{
@Override
void diaplay() {
// TODO Auto-generated method stub
System.out.println("狙撃銃!");
}
}
interface WeaponFactory{
Weapon createWeapon();
}
class MachineGunFactory implements WeaponFactory{
@Override
public Weapon createWeapon() {
// TODO Auto-generated method stub
return new MachineGun();
}
}
class MachineGunBulletFactory implements BulletFactory{
@Override
public Bullet creatBullet() {
// TODO Auto-generated method stub
return new MachineGunBullet();
}
}
class SniperRifleFactory implements WeaponFactory{
@Override
public Weapon createWeapon() {
// TODO Auto-generated method stub
return new SniperRifle();
}
}
class PistolFactory implements WeaponFactory{
@Override
public Weapon createWeapon() {
// TODO Auto-generated method stub
return new Pistol();
}
}
//ピストル弾工場
class PistolBulletFactory implements BulletFactory{
@Override
public Bullet creatBullet() {
// TODO Auto-generated method stub
return new PistolBullet();
}
}
public class DemoN {
public static void main(String[] args) {
WeaponFactory wf1=new MachineGunFactory();
Weapon w1=wf1.createWeapon();
w1.diaplay();
WeaponFactory wf2=new PistolFactory();
Weapon w2=wf2.createWeapon();
w2.diaplay();
WeaponFactory wf3=new SniperRifleFactory();
Weapon w3=wf3.createWeapon();
w3.diaplay();
BulletFactory bf1=new MachineGunBulletFactory();
Bullet b1=bf1.creatBullet();
b1.display();
}
}
3.2 正面#
package abstractFactory.positive;
abstract class Weapon{
abstract void diaplay();
}
/**
* ファクトリーメソッドパターンを使用して抽象ファクトリーパターンを使用しない、現代の工場では生産ラインを追加する必要がある——弾薬クラス Bullet
*
* @author ASUS
*
*/
abstract class Bullet{
abstract void display();
}
/**
* 弾薬クラス
* @author ASUS
*
*/
class PistolBullet extends Bullet{
@Override
void display() {
// TODO Auto-generated method stub
System.out.println("ピストル弾");
}
}
class MachineGunBullet extends Bullet{
@Override
void display() {
// TODO Auto-generated method stub
System.out.println("機関銃弾");
}
}
//抽象工場
interface ArsenalFactory{
Bullet creatBullet();
Weapon creatWeapon();
}
class MachineGun extends Weapon{
@Override
void diaplay() {
// TODO Auto-generated method stub
System.out.println("機関銃");
}
}
class MachineGunFactory implements ArsenalFactory{
@Override
public Bullet creatBullet() {
// TODO Auto-generated method stub
return new MachineGunBullet();
}
@Override
public Weapon creatWeapon() {
// TODO Auto-generated method stub
return new MachineGun();
}
}
class PistolFactory implements ArsenalFactory{
@Override
public Bullet creatBullet() {
// TODO Auto-generated method stub
return new PistolBullet();
}
@Override
public Weapon creatWeapon() {
// TODO Auto-generated method stub
return new Pistol();
}
}
class Pistol extends Weapon{
@Override
void diaplay() {
// TODO Auto-generated method stub
System.out.println("ピストル");
}
}
public class DemoP {
public static void main(String[] args) {
ArsenalFactory af1=new MachineGunFactory();
Weapon w1=af1.creatWeapon();
Bullet b1=af1.creatBullet();
w1.diaplay();
b1.display();
}
}
4. ビルダーパターン#
4.1 反面#
package builder.negative;
class LoggerQiang{
private String eye;
private String ear;
private String mouth;
public String getEye() {
return eye;
}
public void setEye(String eye) {
this.eye = eye;
}
public String getEar() {
return ear;
}
public void setEar(String ear) {
this.ear = ear;
}
public String getMouth() {
return mouth;
}
public void setMouth(String mouth) {
this.mouth = mouth;
}
@Override
public String toString() {
return "LoggerQiang [目=" + eye + ", 耳=" + ear + ", 口=" + mouth + "]";
}
}
public class DemoN_A {
public static void main(String[] args) {
System.out.println("——————嬉しい光頭強————");
LoggerQiang qiang=new LoggerQiang();
qiang.setEar("耳を立てる");
qiang.setEye("目を大きく開く");
qiang.setMouth("口角を上げる");
System.out.println(qiang);
}
/**
* クライアントは光頭強を直接組み立てる。
*/
}
package builder.negative;
class LoggerQiang{
private String eye;
private String ear;
private String mouth;
public String getEye() {
return eye;
}
public void setEye(String eye) {
this.eye = eye;
}
public String getEar() {
return ear;
}
public void setEar(String ear) {
this.ear = ear;
}
public String getMouth() {
return mouth;
}
public void setMouth(String mouth) {
this.mouth = mouth;
}
@Override
public String toString() {
return "LoggerQiang [目=" + eye + ", 耳=" + ear + ", 口=" + mouth + "]";
}
}
//嬉しい光頭強
class HappyQiang{
private LoggerQiang qiang=new LoggerQiang();
public LoggerQiang build(){
this.qiang.setEar("耳を立てる");
this.qiang.setEye("目を大きく開く");
this.qiang.setMouth("口角を上げる");
return this.qiang;
}
}
class DisappintedQiang{
private LoggerQiang qiang=new LoggerQiang();
public LoggerQiang build(){
this.qiang.setEar("耳を小さくする");
this.qiang.setEye("まぶたが下がる");
this.qiang.setMouth("口角を下げる");
return this.qiang;
}
}
public class DemoN_B {
public static void main(String[] args) {
System.out.println("嬉しい光頭強");
HappyQiang qiang=new HappyQiang();
LoggerQiang hq=qiang.build();
System.out.println(hq);
System.out.println("落ち込んでいる光頭強");
DisappintedQiang qiang2=new DisappintedQiang();
LoggerQiang dq=qiang2.build();
System.out.println(dq);
}
}
4.2 正面コード#
package builder.positive;
class LoggerQiang{
private String eye;
private String ear;
private String mouth;
public String getEye() {
return eye;
}
public void setEye(String eye) {
this.eye = eye;
}
public String getEar() {
return ear;
}
public void setEar(String ear) {
this.ear = ear;
}
public String getMouth() {
return mouth;
}
public void setMouth(String mouth) {
this.mouth = mouth;
}
@Override
public String toString() {
return "LoggerQiang [目=" + eye + ", 耳=" + ear + ", 口=" + mouth + "]";
}
}
interface Builder{
void setEye();
void setEar();
void setMouth();
LoggerQiang getResult();
}
class HappyQiangBuilder implements Builder{
private LoggerQiang lq=new LoggerQiang();
@Override
public void setEye() {
// TODO Auto-generated method stub
this.lq.setEye("目を大きく開く");
}
@Override
public void setEar() {
// TODO Auto-generated method stub
this.lq.setEar("耳を立てる");
}
@Override
public void setMouth() {
// TODO Auto-generated method stub
this.lq.setMouth("口角を上げる");
}
@Override
public LoggerQiang getResult() {
// TODO Auto-generated method stub
return this.lq;
}
}
class DisappintedQiangBuilder implements Builder{
private LoggerQiang lq=new LoggerQiang();
@Override
public void setEye() {
// TODO Auto-generated method stub
this.lq.setEye("まぶたが下がる");
}
@Override
public void setEar() {
// TODO Auto-generated method stub
this.lq.setEar("耳を小さくする");
}
@Override
public void setMouth() {
// TODO Auto-generated method stub
this.lq.setMouth("口角を下げる");
}
@Override
public LoggerQiang getResult() {
// TODO Auto-generated method stub
return this.lq;
}
}
class Director{
private Builder builder;
public Director(Builder bulider) {
super();
this.builder = bulider;
}
public LoggerQiang build() {
this.builder.setEar();
this.builder.setEye();
this.builder.setMouth();
return this.builder.getResult();
}
}
public class DemoP {
public static void main(String[] args) {
System.out.println("嬉しい光頭強");
Builder hqb=new HappyQiangBuilder();
LoggerQiang lq1=new Director(hqb).build();
System.out.println(lq1);
System.out.println("落ち込んでいる光頭強");
Builder dbq=new DisappintedQiangBuilder();
LoggerQiang lq2=new Director(dbq).build();
System.out.println(lq2);
}
}
5. プロトタイプパターン#
5.1 反面コード#
package prototype.negative;
class Weather{
private String city;
private String date;
private String weatherPhenmenon;
private String airQuality;
private String wind;
public Weather(String city, String date, String weatherPhenmenon, String airQuality, String wind) {
super();
this.city = city;
this.date = date;
this.weatherPhenmenon = weatherPhenmenon;
this.airQuality = airQuality;
this.wind = wind;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getWeatherPhenmenon() {
return weatherPhenmenon;
}
public void setWeatherPhenmenon(String weatherPhenmenon) {
this.weatherPhenmenon = weatherPhenmenon;
}
public String getAirQuality() {
return airQuality;
}
public void setAirQulity(String airQuality) {
this.airQuality = airQuality;
}
public String getWind() {
return wind;
}
public void setWind(String wind) {
this.wind = wind;
}
@Override
public String toString() {
return "Weather [都市=" + city + ", 日付=" + date + ", 天候現象=" + weatherPhenmenon + ", 空気質="
+ airQuality + ", 風=" + wind + "]";
}
}
public class DemoN {
public static void main(String[] args) {
Weather today=new Weather("張家界","2021年10月24日","小雨","優","北東風 微風");
System.out.println(today);
System.out.println("翌日は日付と天候現象だけが変わり、他の要素は変わらない");
Weather tomorrow=new Weather("張家界","2021年10月25日","曇り","優","北東風 微風");
System.out.println(tomorrow);
}
}
5.2.1 正面コード ——A#
package prototype.positive.a;
class WeatherDate{
private String year;
private String month;
private String day;
public WeatherDate(String year, String month, String day) {
super();
this.year = year;
this.month = month;
this.day = day;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getMonth() {
return month;
}
public void setMonth(String month) {
this.month = month;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
@Override
public String toString() {
return "WeatherDate [年=" + year + ", 月=" + month + ", 日=" + day + "]";
}
}
class Weather implements Cloneable{
private String city;
private WeatherDate date;
private String weatherPhenmenon;
private String airQuality;
private String wind;
public Weather(String city, WeatherDate date, String weatherPhenmenon, String airQuality, String wind) {
super();
this.city = city;
this.date = date;
this.weatherPhenmenon = weatherPhenmenon;
this.airQuality = airQuality;
this.wind = wind;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public WeatherDate getDate() {
return date;
}
public void setDate(WeatherDate date) {
this.date = date;
}
public String getWeatherPhenmenon() {
return weatherPhenmenon;
}
public void setWeatherPhenmenon(String weatherPhenmenon) {
this.weatherPhenmenon = weatherPhenmenon;
}
public String getAirQuality() {
return airQuality;
}
public void setAirQulity(String airQuality) {
this.airQuality = airQuality;
}
public String getWind() {
return wind;
}
public void setWind(String wind) {
this.wind = wind;
}
@Override
public String toString() {
return "Weather [都市=" + city + ", 日付=" + date + ", 天候現象=" + weatherPhenmenon + ", 空気質="
+ airQuality + ", 風=" + wind + "]";
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
Object obj=null;
obj=super.clone();
return obj;
}
}
public class DemoP {
public static void main(String[] args) throws CloneNotSupportedException {
Weather today=new Weather("張家界",new WeatherDate("2021","10","24"),"小雨","優","北東風 微風");
System.out.println(today);
System.out.println("翌日は日付と天候現象だけが変わり、他の要素は変わらない");
Weather tomorrow=(Weather)today.clone();
tomorrow.getDate().setDay("25");
tomorrow.setWeatherPhenmenon("曇り");
System.out.println(tomorrow);
System.out.println("再度todayを出力\n"+today);//浅いクローン、今日と以前の今日は異なる
}
}
5.2.2 正面コード ——B#
package prototype.positive.b;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
interface WeatherPrototype{
Object cloneMe() throws Exception;
}
class Weather implements WeatherPrototype,Serializable{
private String city;
private String date;
private String weatherPhenmenon;
private String airQuality;
private String wind;
public Weather(String city, String date, String weatherPhenmenon, String airQuality, String wind) {
super();
this.city = city;
this.date = date;
this.weatherPhenmenon = weatherPhenmenon;
this.airQuality = airQuality;
this.wind = wind;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getWeatherPhenmenon() {
return weatherPhenmenon;
}
public void setWeatherPhenmenon(String weatherPhenmenon) {
this.weatherPhenmenon = weatherPhenmenon;
}
public String getAirQuality() {
return airQuality;
}
public void setAirQulity(String airQuality) {
this.airQuality = airQuality;
}
public String getWind() {
return wind;
}
public void setWind(String wind) {
this.wind = wind;
}
@Override
public String toString() {
return "Weather [都市=" + city + ", 日付=" + date + ", 天候現象=" + weatherPhenmenon + ", 空気質="
+ airQuality + ", 風=" + wind + "]";
}
@Override
public Object cloneMe() throws Exception {
// TODO Auto-generated method stub
Object obj=null;
ByteArrayOutputStream bos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis =new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bis);
obj=ois.readObject();
return obj;
}
}
public class DemoP {
public static void main(String[] args) throws Exception {
Weather today=new Weather("張家界","2021年10月24日","小雨","優","北東風 微風");
System.out.println(today);
System.out.println("翌日は日付と天候現象だけが変わり、他の要素は変わらない");
Weather tomrrow=(Weather)today.cloneMe();
tomrrow.setDate("2021年10月25日");
tomrrow.setWeatherPhenmenon("曇り");
System.out.println(tomrrow);
}
}
5.2.3 正面コード ——C#
package prototype.positive.c;
class WeatherDate implements Cloneable {
private String year;
private String month;
private String day;
public WeatherDate(String year, String month, String day) {
super();
this.year = year;
this.month = month;
this.day = day;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getMonth() {
return month;
}
public void setMonth(String month) {
this.month = month;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
@Override
public String toString() {
return "WeatherDate [年=" + year + ", 月=" + month + ", 日=" + day + "]";
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
}
class Weather implements Cloneable{
private String city;
private WeatherDate date;
private String weatherPhenmenon;
private String airQuality;
private String wind;
public Weather(String city, WeatherDate date, String weatherPhenmenon, String airQuality, String wind) {
super();
this.city = city;
this.date = date;
this.weatherPhenmenon = weatherPhenmenon;
this.airQuality = airQuality;
this.wind = wind;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public WeatherDate getDate() {
return date;
}
public void setDate(WeatherDate date) {
this.date = date;
}
public String getWeatherPhenmenon() {
return weatherPhenmenon;
}
public void setWeatherPhenmenon(String weatherPhenmenon) {
this.weatherPhenmenon = weatherPhenmenon;
}
public String getAirQuality() {
return airQuality;
}
public void setAirQulity(String airQuality) {
this.airQuality = airQuality;
}
public String getWind() {
return wind;
}
public void setWind(String wind) {
this.wind = wind;
}
@Override
public String toString() {
return "Weather [都市=" + city + ", 日付=" + date + ", 天候現象=" + weatherPhenmenon + ", 空気質="
+ airQuality + ", 風=" + wind + "]";
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
Object obj=null;
obj=super.clone();
this.date=(WeatherDate)this.date.clone();
return obj;
}
}
public class DemoP {//深いクローン
public static void main(String[] args) throws CloneNotSupportedException {
Weather today=new Weather("張家界",new WeatherDate("2021","10","24"),"小雨","優","北東風 微風");
System.out.println(today);
System.out.println("翌日は日付と天候現象だけが変わり、他の要素は変わらない");
Weather tomorrow=(Weather)today.clone();
tomorrow.getDate().setDay("25");
tomorrow.setWeatherPhenmenon("曇り");
System.out.println(tomorrow);
System.out.println("再度todayを出力\n"+today);
}
}
6. シングルトンパターン#
6.1 反面コード#
package singleton.negative;
class Moon{
private double radius=1738.14;
private String state;//形状
public Moon(String state) {
super();
this.state = state;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Override
public String toString() {
return "Moon [半径=" + radius + ", 形状=" + state + "]";
}
}
class Bear{
private String name;
public Bear(String name) {
super();
this.name = name;
}
public void look(Moon moon) {
System.out.println(this.name+"が見た月:" + moon);
}
}
public class DemoN {
public static void main(String[] args) {
Moon m1=new Moon("満月");
Moon m2=new Moon("半月");
Bear big=new Bear("熊大");
Bear little=new Bear("熊二");
big.look(m1);
little.look(m2);
//空には月が一つしか存在できない、事実に反する
}
}
6.2 正面コード#
package singleton.positive.A;
/**
* 餓漢式シングルトンパターン
* (1)複数のスレッドが同時にアクセスする問題を考慮する必要がない
* (2)呼び出し速度と反応時間は懶漢式シングルトンパターンより優れている
* (3)リソース利用率は懶漢式システムより劣り、システムのロード時間が長い
* @author ASUS
*
*/
class Moon{
private final double radius=1738.14;
private String state;//形状
//(1)静的プライベートメンバー
private static final Moon instance=new Moon();
//プライベートコンストラクタ、外部から新しいオブジェクトを作成できない
private Moon() {
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
//公の工場メソッド、または唯一のオブジェクト
public static Moon getInstance() {
return instance;
}
@Override
public String toString() {
return "Moon [半径=" + radius + ", 形状=" + state + "]";
}
}
class Bear{
private String name;
public Bear(String name) {
super();
this.name = name;
}
public void look(Moon moon) {
System.out.println(this.name+"が見た月:" + moon);
}
}
public class DemoP_1 {
public static void main(String[] args) {
// Moon m1=new Moon("");新しいオブジェクトを作成できない、コンストラクタがプライベート化されている
Moon m1=Moon.getInstance();
Moon m2=Moon.getInstance();
m1.setState("満月");
m2.setState("半月");
Bear big=new Bear("熊大");
Bear little=new Bear("熊二");
big.look(m1);
little.look(m2);
System.out.println(m1.hashCode());
System.out.println(m2.hashCode());
}
}
package singleton.positive.B;
/**
* 懶漢式シングルトンパターン
* (1)遅延ロードを実現//必要なときにロード
* (2)複数のスレッドが同時にリソースにアクセスする必要がある
* (3)二重チェックロックなどのメカニズムを通じて制御する必要があり、システムの性能に一定の影響を与える
* @author ASUS
*
*/
class Moon{
private final double radius=1738.14;
private String state;//形状
//(1)静的プライベートメンバー
private static Moon instance=null;//定数ではないのでfinalを使用しない
//プライベートコンストラクタ、外部から新しいオブジェクトを作成できない
private Moon() {
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
//公の工場メソッド、または唯一のオブジェクト
public static synchronized Moon getInstance() {
if(instance==null)
instance=new Moon();
return instance;
}
@Override
public String toString() {
return "Moon [半径=" + radius + ", 形状=" + state + "]";
}
}
class Bear{
private String name;
public Bear(String name) {
super();
this.name = name;
}
public void look(Moon moon) {
System.out.println(this.name+"が見た月:" + moon);
}
}
public class DemoP_2 {
public static void main(String[] args) {
// Moon m1=new Moon("");新しいオブジェクトを作成できない、コンストラクタがプライベート化されている
Moon m1=Moon.getInstance();
Moon m2=Moon.getInstance();
m1.setState("満月");
m2.setState("半月");
Bear big=new Bear("熊大");
Bear little=new Bear("熊二");
big.look(m1);
little.look(m2);
System.out.println(m1.hashCode());
System.out.println(m2.hashCode());
}
}
package singleton.positive.C;
/**
* 静的内部クラスシングルトンパターン
* (1)スレッドセーフ、遅延ロードはなく、効率は餓漢式と同じ、懶漢式と餓漢式の利点を持つ
*
* @author ASUS
*
*/
class Moon{
private final double radius=1738.14;
private String state;//形状
//(1)静的内部クラス
private static class MoonInstance{
private static Moon instance=new Moon();
}
//プライベートコンストラクタ、外部から新しいオブジェクトを作成できない
private Moon() {
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
//公の工場メソッド、または唯一のオブジェクト
public static Moon getInstance() {
return MoonInstance.instance;
}
@Override
public String toString() {
return "Moon [半径=" + radius + ", 形状=" + state + "]";
}
}
class Bear{
private String name;
public Bear(String name) {
super();
this.name = name;
}
public void look(Moon moon) {
System.out.println(this.name+"が見た月:" + moon);
}
}
public class DemoP_3 {
public static void main(String[] args) {
// Moon m1=new Moon("");新しいオブジェクトを作成できない、コンストラクタがプライベート化されている
Moon m1=Moon.getInstance();
Moon m2=Moon.getInstance();
m1.setState("満月");
// m2.setState("半月");
Bear big=new Bear("熊大");
Bear little=new Bear("熊二");
big.look(m1);
little.look(m2);
System.out.println(m1.hashCode());
System.out.println(m2.hashCode());
}
}
7. テンプレートメソッドパターン#
7.1 反面コード#
package templateMethod.negative;
class LoggerQiang{
public void workOn() {//ストーリー1
System.out.println("光頭強が木を切る準備をしています!");
System.out.println("光頭強が出発しました");
System.out.println("光頭強が電動ノコギリで木を切ります!");
System.out.println("光頭強が車で木材を運びます");
System.out.println("光頭強は木材を売る必要がありません!");
System.out.println("光頭強が昼食を食べます");
}
}
class LoggerQiang2{
public void workOn() {//ストーリー1
System.out.println("光頭強が木を切る準備をしています!");
System.out.println("光頭強が出発しました");
System.out.println("光頭強が斧で木を切ります!");
System.out.println("光頭強が三輪車で木材を運びます");
System.out.println("光頭強が木材を売ります!");
System.out.println("光頭強が昼食を食べます");
}
}
public class DemoN {
public static void main(String[] args) {
new LoggerQiang().workOn();
System.out.println("ストーリー2");
new LoggerQiang2().workOn();
}
/**
* 欠点
* (1)伐木プロセスシステムだが、異なる具体的な方法を採用している
* (2)オープン・クローズド原則に違反している
* (3)依存関係逆転原則に違反している
*/
}
7.2 正面コード#
package templateMethod.positive;
abstract class LoggerTemplate{
protected void ready() {
System.out.println("光頭強が準備中...");
}
protected void setout() {
System.out.println("光頭強が出発しました...");
}
protected void sellToother() {
System.out.println("光頭強が自分で木を売ります...");
}
protected void sellToli() {
System.out.println("光頭強が木を李老板に売ります...");
}
protected boolean isSell() {
return true;
}
public void eat() {
System.out.println("光頭強が昼食を食べます...");
}
protected abstract void cutTree();
protected abstract void transport();
//テンプレートメソッド
public final void workOn(){
this.ready();
this.setout();
this.cutTree();
this.transport();
if(isSell())//もし真なら、光頭強は自分で木を売る
this.sellToother();
else
this.sellToli();
this.eat();
}
}
class LoggerQiang extends LoggerTemplate{
@Override
protected void cutTree() {
// TODO Auto-generated method stub
System.out.println("電動ノコギリで木を切ります");
}
@Override
protected void transport() {
// TODO Auto-generated method stub
System.out.println("トラックで木材を運びます");
}
}
class LoggerQiang1 extends LoggerTemplate{
@Override
protected void cutTree() {
// TODO Auto-generated method stub
System.out.println("斧で木を切ります...");
}
@Override
protected void transport() {
// TODO Auto-generated method stub
System.out.println("三輪車で木材を運びます...");
}
public boolean isSell() {
return false;
}
}
public class DemoP {
public static void main(String[] args) {
System.out.println("ストーリー1————————");
LoggerTemplate a=new LoggerQiang();
a.workOn();
System.out.println("ストーリー2————————");
LoggerTemplate b=new LoggerQiang1();
b.workOn();
}//オープン・クローズド原則に適合している
}
8. 中介者パターン#
8.1 反面コード#
package mediator.negative;
class BankAccount{
private double money;
public BankAccount(double money) {
super();
this.money = money;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public void deposit(double money) {
this.money+=money;
}
public void withDraw(double money) {
this.money-=money;
}
}
class Sale{
private int number=5;
private double prive=111;
private BankAccount bank=new BankAccount(100);
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public double getPrive() {
return prive;
}
public void setPrive(double prive) {
this.prive = prive;
}
public BankAccount getBank() {
return bank;
}
public void setBank(BankAccount bank) {
this.bank = bank;
}
public void sellHouse(int saleNumber) {//家を売る
Purchase purchase=new Purchase();//家を買う人
purchase.buyHouse(saleNumber);
double money=saleNumber*prive;//販売金
this.bank.deposit(money);//販売者が預金
this.number=this.number-saleNumber;//家の数量が減少
}
@Override
public String toString() {
return "Sale [数量=" + number + ", 単価=" + prive + ", 口座=" + bank.getMoney() + "]";
}
}
class Purchase{
private int number;
private BankAccount bank=new BankAccount(2000);
public void buyHouse(int buyNumber) {
this.number+=buyNumber;
Sale sale=new Sale();
sale.setNumber(sale.getNumber()-buyNumber);
double money=sale.getPrive()*buyNumber;
this.bank.withDraw(money);
}
@Override
public String toString() {
return "Purchase [数量" + number + ", 口座" + bank.getMoney() + "]";
}
}
public class DemoN {
public static void main(String[] args) {
Sale sale=new Sale();
Purchase pur=new Purchase();
System.out.println("___取引前の状態——————");
System.out.println("販売者"+sale);
System.out.println("購入者"+pur);
sale.sellHouse(2);
pur.buyHouse(2);
System.out.println("取引後の状態");
System.out.println("販売者"+sale);
System.out.println("購入者"+pur);
}
}
8.2 正面コード#
package mediator.positive;
abstract class AbstractMediator{
protected Sale sale;
protected Purchase purchase;
public AbstractMediator() {
super();
this.sale = new Sale(this);
this.purchase = new Purchase(this);
}
public void register(AbstractColleague coll) {
String name=coll.getClass().getSimpleName();
if(name.equalsIgnoreCase("Sale"))
this.sale=(Sale)coll;
else if(name.equalsIgnoreCase("Purchase"))
this.purchase=(Purchase)coll;
}
abstract void sellHouse(int number);
abstract void buyHouse(int number);
}
class Mediator extends AbstractMediator{
public Mediator() {
}
@Override
void sellHouse(int number) {
// TODO Auto-generated method stub
this.sale.setNumber(this.sale.getNumber()-number);
double money=this.sale.getPrice()*number;
this.sale.getBank().deposit(money);
}
@Override
void buyHouse(int number) {
// TODO Auto-generated method stub
this.purchase.setNumber(this.purchase.getNumber()+number);
double money=this.sale.getPrice()*number;
this.purchase.getBank().withDraw(money);
}
}
abstract class AbstractColleague{
protected AbstractMediator mediator;
public AbstractColleague() {
super();
}
public AbstractColleague(AbstractMediator mediator) {
super();
this.mediator = mediator;
}
}
class Sale extends AbstractColleague{
private BankAccount bank;
private int number=5;
private double price=111;
public Sale() {
}
public Sale(AbstractMediator mediator) {
super(mediator);
this.bank=new BankAccount();
mediator.register(this);
}
public BankAccount getBank() {
return bank;
}
public void setBank(BankAccount bank) {
this.bank = bank;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public void sellHouse(int saleNumber) {
this.mediator.sellHouse(saleNumber);
}
@Override
public String toString() {
return "Sale [銀行口座=" + bank.getMoney() + ", 数量=" + number + ", 単価=" + price + "]";
}
}
class Purchase extends AbstractColleague{
private int number;
private BankAccount bank;
public Purchase(AbstractMediator mediator) {
super(mediator);
this.bank=new BankAccount();
this.mediator.register(this);
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public BankAccount getBank() {
return bank;
}
public void setBank(BankAccount bank) {
this.bank = bank;
}
public void buyHouse(int number) {
this.mediator.buyHouse(number);
}
@Override
public String toString() {
return "Purchase [数量=" + number + ", 口座=" + bank.getMoney() + "]";
}
}
class BankAccount extends AbstractColleague{
private double money=0;
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public void deposit(double money) {
this.money=this.money+money;
}
public void withDraw(double money) {
this.money=this.money-+money;
}
@Override
public String toString() {
return "BankAccount [money=" + money + "]";
}
}
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
AbstractMediator mediator=new Mediator();
Sale sale=new Sale(mediator);
Purchase pur=new Purchase(mediator);
pur.getBank().deposit(99999);
System.out.println("___取引前の状態——————");
System.out.println("販売者"+sale);
System.out.println("購入者"+pur);
sale.sellHouse(2);
pur.buyHouse(2);
System.out.println("取引後の状態");
System.out.println("販売者"+sale);
System.out.println("購入者"+pur);
}
}
9. コマンドパターン#
9.1 反面コード:#
package command.negaative;
class Cook{
public void beef(){
System.out.println("一皿の牛肉");
}
public void duck(){
System.out.println("一皿の醤板鴨");
}
public void chineseCabbage(){
System.out.println("一大白菜");
}
}
public class Demo {
//責任が不明確で、ウェイターの役割が欠けている
//コマンドパターンを採用する必要がある
public static void main(String[] args) {
new Cook().beef();
new Cook().chineseCabbage();
}
}
9.2 正面コード:#
package command.positive;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
class Cook{
public void beef(){
System.out.println("一皿の牛肉");
}
public void duck(){
System.out.println("一皿の醤板鴨");
}
public void chineseCabbage(){
System.out.println("一大白菜");
}
}
//抽象コマンド
abstract class Command{
protected Cook cook;
public Command(Cook cook) {
this.cook = cook;
}
abstract void execute();
}
class BeefCommand extends Command{
public BeefCommand(Cook cook) {
super(cook);
}
@Override
void execute() {
this.cook.beef();
}
}
class DuckCommand extends Command{
public DuckCommand(Cook cook) {
super(cook);
}
@Override
void execute() {
this.cook.duck();
}
}
class ChineseCabbage extends Command{
public ChineseCabbage(Cook cook) {
super(cook);
}
@Override
void execute() {
this.cook.chineseCabbage();
}
}
class Waiter{
private Command command;
public Command getCommand() {
return command;
}
public void setCommand(Command command) {
this.command = command;
}
public void orderDishes(){
this.command.execute();
}
}
class WaitList{
private List<Command> menu=new ArrayList<>();
public void adCommand(Command command){
this.menu.add(command);
}
public void orderDisher(){
for(Command command:menu){
command.execute();
}
}
}
public class Demo {
public static void main(String[] args) {
Cook wang=new Cook();
Command beef=new BeefCommand(wang);
Command duck=new DuckCommand(wang);
Command cabbage=new ChineseCabbage(wang);
Waiter xiaoer=new Waiter();
xiaoer.setCommand(beef);
xiaoer.orderDishes();
xiaoer.setCommand(duck);
xiaoer.orderDishes();
xiaoer.setCommand(cabbage);
xiaoer.orderDishes();
System.out.println("二つ目の状況:一緒に注文(1つずつではなく)");
WaitList waitList = new WaitList();
waitList.adCommand(cabbage);
waitList.adCommand(duck);
waitList.adCommand(beef);
waitList.orderDisher();
}
}