8. ■ソースコード例
・Clientクラス
public class Client {
public static void main(String[] args){
Target target = new Adapter(); ←Adapterインスタンスを生成
target.targetMethod1();
target.targetMethod2();
}
}
・Targetクラス
public abstract class Target { ←処理を呼び出すための抽象クラス
public abstract void targetMethod1();
public abstract void targetMethod2();
}
9. ■ソースコード例
・Adapterクラス
public class Adapter extends Target {
private Adaptee adaptee; ←Adapteeをフィールド変数として宣言
public Adapter(){
this.adaptee = new Adaptee(); ←Adapteeインスタンスを生成
}
public void targetMethod1(){
adaptee.method1(); ←Adapteeインスタンスから処理の呼び出し
}
public void targetMethod2(){
adaptee.method2(); ←同上
}
}
・Adapteeクラス
public class Adaptee {
public void method1(){
System.out.println("method1");
}
public void method2(){
System.out.println("method2");
}
}
10. ●別のクラスの処理を足す例
※※Adaptee2クラスと言う別のクラスの処理method3を足す場合、以下のように追加する※※
・Targetクラス
public abstract class Target {
public abstract void targetMethod1();
public abstract void targetMethod2();
public abstract void targetMethod3(); ←呼び出しの追加
}
・Adapterクラス
public class Adapter extends Target {
private Adaptee adaptee;
private Adaptee2 adaptee2; ←使われていなかったAdaptee2クラス変数の宣言
public Adapter(){
this.adaptee = new Adaptee();
this.adaptee2 = new Adaptee2(); ←Adaptee2インスタンスを生成
}
public void targetMethod1(){
adaptee.method1();
}
…
public void targetMethod3(){
adaptee2.method3(); ←Adaptee2クラスのメソッド呼び出し
}
}
11. ・追加クラス Adaptee2
・Adaptee2クラス
public class Adaptee2 {
public void method3(){
System.out.println(“method3”); ←Adapteeクラスには無かった処理
}
}
■結果、Clientクラスは呼び出すだけで内容には関知しない
・Clientクラス
public class Client {
public static void main(String[] args){
Target target = new Adapter();
target.targetMethod1();
target.targetMethod2();
target.targetMethod3(); ←別クラスのメソッド呼び出しの追加
}
}
33. AbstractFactory.java
public abstract class AbstractFactory {
public static AbstractFactory createFactory(int factoryId){
switch(factoryId){
case ConcreteFactoryA.id:
return new ConcreteFactoryA();
case ConcreteFactoryB.id:
return new ConcreteFactoryB();
default:
return null;
}
}
public abstract AbstractProduct1 createProduct1();
public abstract AbstractProduct2 createProduct2();
public abstract AbstractProduct3 createProduct3();
}
34. ConcreteFactoryA.java
public class ConcreteFactoryA extends AbstractFactory {
public static final int id = 1;
public AbstractProduct1 createProduct1() {
return new ConcreteProductA1("工場A - 製品1");
}
public AbstractProduct2 createProduct2() {
return new ConcreteProductA2("工場A - 製品2");
}
public AbstractProduct3 createProduct3() {
return new ConcreteProductA3("工場A - 製品3");
}
}
35. ConcreteFactoryB.java
public class ConcreteFactoryB extends AbstractFactory {
public static final int id = 2;
public AbstractProduct1 createProduct1() {
return new ConcreteProductB1("工場B - 製品1");
}
public AbstractProduct2 createProduct2() {
return new ConcreteProductB2("工場B - 製品2");
}
public AbstractProduct3 createProduct3() {
return new ConcreteProductB3("工場B - 製品3");
}
}
36. Client.java
public class Client {
public static void main(String[] args) {
List<AbstractFactory> factorys =
new ArrayList<AbstractFactory>();
factorys.add(AbstractFactory.createFactory(ConcreteFactoryA.id));
factorys.add(AbstractFactory.createFactory(ConcreteFactoryB.id));
Iterator<AbstractFactory> it = factorys.iterator();
while (it.hasNext()){
AbstractFactory factory = it.next();
AbstractProduct1 product1 = factory.createProduct1();
AbstractProduct2 product2 = factory.createProduct2();
AbstractProduct3 product3 = factory.createProduct3();
product1.execute();
product2.run();
product3.action();
}
}
}