ファクトリパターン:
オブジェクトを作成するためのインターフェイスを定義し、サブクラスにインスタンス化するクラスを決定させます。ファクトリメソッドは、クラスのサブクラスへのインスタンス化を遅らせ、オープンクローズの原則に違反する単純なファクトリの欠点を克服し、オブジェクト作成プロセスをカプセル化する利点を維持します。
オープンクローズ原則:拡張のためにオープン、変更のためにクローズ
学生とボランティアは雷鋒クラスを継承します。学生ファクトリーとボランティアファクトリーは雷鋒ファクトリインターフェイスを実装します。インスタンス化されたオブジェクトを変更する必要がある場合は、ファクトリのみを変更する必要があります。新しいクラスを追加するときは、元のクラスのコードを変更せずに、新しいファクトリを追加するだけで済みます。
//雷锋
public class LeiFeng {
public void wash() {
System.out.println("洗衣服");;
}
public void cook() {
System.out.println("做饭");;
}
}
public class Student extends LeiFeng {
public Student() {
System.out.println("我是大学生");
}
}
public class Volunteer extends LeiFeng{
public Volunteer() {
System.out.println("我是志愿者");
}
}
//雷锋工厂
public interface MyFactory {
public LeiFeng createLeiFeng();
}
public class StudentFactory implements MyFactory{
@Override
public LeiFeng createLeiFeng() {
return new Student();
}
}
public class VolunteerFactory implements MyFactory {
@Override
public LeiFeng createLeiFeng() {
return new Volunteer();
}
public static void main(String[] args) {
MyFactory myFactory = new StudentFactory(); //只需要改动这句,无需像简单工厂去改变已有的类。
LeiFeng student = myFactory.createLeiFeng();
myFactory = new VolunteerFactory();
LeiFeng volunteer = myFactory.createLeiFeng();
}
}