1. 程式人生 > >一(3)抽象工廠模式&&簡單工廠+反射改進抽象工廠

一(3)抽象工廠模式&&簡單工廠+反射改進抽象工廠

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{ @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("奧迪旗下的商務車"); } } 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)抽象工廠模式&&簡單工廠+反射改進抽象工廠