一(3)抽象工廠模式&&簡單工廠+反射改進抽象工廠
阿新 • • 發佈:2017-09-26
reat end ssi 一行代碼 rate imp 缺點 接口 ner
1 抽象工廠?
抽象工廠用在既有產品樹,又有產品族的場合。
產品樹:奔馳旗下的跑車和商務車構成產品樹
產品族:奔馳旗下的跑車與奧迪旗下的跑車構成產品族。
/*
缺點:此時如果需要增加一個紅旗廠家的車,需要改的地方很多。
1 定義紅旗抽象類,具體類;
2 Factory接口增加生產紅旗的工廠;
3 跑車工廠和商務車工廠都需要實現相應的生產紅旗的接口。
*/
/*
優點:當需要使用不同產品時,只需要改一行代碼 Factory factory = new SprotCarFactory();,即初始化不同的工廠,就可以調用工廠中的不同方法了。
*/
package com.biao.factory.abstractfactory;public class AbstractFactoryDemo { public static void main(String[] args) { Factory factory = new SprotCarFactory(); AudiCar audiCar = factory.createAudiCar(); audiCar.drive(); Factory bussinessCarfactory = new BusinessCarFactory(); BenzCar benzCar= bussinessCarfactory.createBenzCar(); benzCar.drive(); } } abstract class BenzCar{ abstract void drive(); } class BenzSportCar extends BenzCar{ @Override void drive() { System.out.println("奔馳旗下的跑車"); } } class BenzBusinessCar extends BenzCar{ @Overridevoid drive() { System.out.println("奔馳旗下的商務車"); } } abstract class AudiCar{ abstract void drive(); } class AudiSportCar extends AudiCar{ @Override void drive() { System.out.println("奧迪旗下的跑車"); } } class AudiBusinessCar extends AudiCar{ @Override void drive() { System.out.println("奧迪旗下的商務車"); } } interface Factory{ BenzCar createBenzCar(); AudiCar createAudiCar(); } class SprotCarFactory implements Factory{ @Override public BenzCar createBenzCar() { // TODO Auto-generated method stub return new BenzSportCar(); } @Override public AudiCar createAudiCar() { // TODO Auto-generated method stub return new AudiSportCar(); } } class BusinessCarFactory implements Factory{ @Override public BenzCar createBenzCar() { // TODO Auto-generated method stub return new BenzBusinessCar(); } @Override public AudiCar createAudiCar() { // TODO Auto-generated method stub return new AudiBusinessCar(); } }
2 代碼改進?
package com.biao.factory.abstractfactory.improment; /* * 改進以後,如果要加入紅旗系列的車,需要做的: 1 定義紅旗抽象類,具體類; 2 Factory接口增加一個生產紅旗車的方法。 */ public class ReflactAddASimpleFactory { public static void main(String[] args) { try { AudiCar createAudiCar = Factory.createAudiCar("com.biao.factory.abstractfactory.improment.AudiSportCar"); BenzCar createBenzCar = Factory.createBenzCar("com.biao.factory.abstractfactory.improment.BenzBusinessCar"); createBenzCar.drive(); createAudiCar.drive(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } abstract class BenzCar{ abstract void drive(); } class BenzSportCar extends BenzCar{ @Override void drive() { System.out.println("奔馳旗下的跑車"); } } class BenzBusinessCar extends BenzCar{ @Override void drive() { System.out.println("奔馳旗下的商務車"); } } abstract class AudiCar{ abstract void drive(); } class AudiSportCar extends AudiCar{ @Override void drive() { System.out.println("奧迪旗下的跑車"); } } class AudiBusinessCar extends AudiCar{ @Override void drive() { System.out.println("奧迪旗下的商務車"); } } /*用簡單工廠配合反射 替代抽象工廠*/ class Factory{ public static AudiCar createAudiCar(String name) throws Exception{ return (AudiCar)Class.forName(name).newInstance(); } public static BenzCar createBenzCar(String name) throws Exception{ return (BenzCar) Class.forName(name).newInstance(); } }
一(3)抽象工廠模式&&簡單工廠+反射改進抽象工廠