02. Factory Method模式代碼

    2. Factory Method 本質:延遲到子類來選擇實現
      2.1 EXPORT OPERATE FACTORY
        public interface ExportFileApi {
            public boolean export(String data);
        }
        public class ExportDb implements ExportFileApi{
            public boolean export(String data) {
                System.out.println("Export data '" + data + "' to DB.");
                return true;
            }
        }
        public class ExportTxtFile implements ExportFileApi{
            public boolean export(String data) {
                System.out.println("Export data '" + data + "' to a TXT file.");
                return true;
            }
        }
        public abstract class ExportOperateFactory {
            public boolean export(String data) {
                ExportFileApi api = factoryMethod();
                return api.export(data);
            }
            protected abstract ExportFileApi factoryMethod();
        }
        public class ExportDbOperateFactory extends ExportOperateFactory {
            protected ExportFileApi factoryMethod() {
                return new ExportDb();
            }
        }
        public class ExportTxtFileOperateFactory extends ExportOperateFactory {
            protected ExportFileApi factoryMethod() {
                return new ExportTxtFile();
            }
        }
        public class FactoryMethodClient {
            public static void main(String[] args) {
                ExportOperateFactory operateFactory = new ExportDbOperateFactory();
                operateFactory.export("data for testing");
            }
        }
      2.2 HUMAN FACTORY
        public interface Human {
            //每個人種都有相應的顏色
            public void getColor();
            //人類會說話
            public void talk();
        }
        public class WhiteHuman implements Human {
            //白色人種的顏色是白色的
            public void getColor(){
                System.out.println("白色人種的皮膚顏色是白色的!");
            }
            //白色人種講話
            public void talk() {
                System.out.println("白色人種會說話,一般都是但是單字節。");
            }
        }
        public class BlackHuman implements Human {
            public void getColor(){
                System.out.println("黑色人種的皮膚顏色是黑色的!");
            }
            public void talk() {
                System.out.println("黑人會說話,一般人聽不懂。");
            }
        }
        public class YellowHuman implements Human {
            public void getColor(){
                System.out.println("黃色人種的皮膚顏色是黃色的!");
            }
            public void talk() {
                System.out.println("黃色人種會說話,一般說的都是雙字節。");
            }
        }
        public abstract class AbstractHumanFactory {
            public abstract <T extends Human> T createHuman(Class<T> c);
        }
        public class HumanFactory extends AbstractHumanFactory {
            public <T extends Human> T createHuman(Class<T> c){
                //定義一個生產的人種
                Human human=null;
                try {
                    //產生一個人種
                    human = (Human)Class.forName(c.getName()).newInstance();
                } catch (Exception e) {
                    System.out.println("人種生成錯誤!");
                }
                return (T)human;
            }
        }
        public class NvWa {
            public static void main(String[] args) {
                //聲明陰陽八卦爐
                AbstractHumanFactory YinYangLu = new HumanFactory();
                //女媧第一次造人
                System.out.println("--造出的第三批人是白色人種--");
                Human whiteHuman = YinYangLu.createHuman(WhiteHuman.class);
                whiteHuman.getColor();
                whiteHuman.talk();
                //女媧第二次造人
                System.out.println("\n--造出的第三批人是黑色人種--");
                Human blackHuman = YinYangLu.createHuman(BlackHuman.class);
                blackHuman.getColor();
                blackHuman.talk();
                //第三次造人
                System.out.println("\n--造出的第三批人是黃色人種--");
                Human yellowHuman = YinYangLu.createHuman(YellowHuman.class);
                yellowHuman.getColor();
                yellowHuman.talk();
            }
        }


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章