一抽象工厂模式&&简单工厂+反射改进抽象工厂

Posted 国境之南时代

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一抽象工厂模式&&简单工厂+反射改进抽象工厂相关的知识,希望对你有一定的参考价值。

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();
    }
}

 

以上是关于一抽象工厂模式&&简单工厂+反射改进抽象工厂的主要内容,如果未能解决你的问题,请参考以下文章

简单工厂模式&工厂方法模式&抽象工厂模式的区别

简单工厂模式&工厂方法模式&抽象工厂模式

工厂模式&抽象工厂——HeadFirst设计模式学习笔记

反射+配置文件+抽象工厂

设计模式——抽象工厂模式

抽象工厂模式(JAVA反射)