码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-09-26 17:47:33      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:sys   throw   abstract   一行代码   imp   rtc   地方   span   ack   

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)抽象工厂模式&&简单工厂+反射改进抽象工厂

标签:sys   throw   abstract   一行代码   imp   rtc   地方   span   ack   

原文地址:http://www.cnblogs.com/buptzlb/p/7597556.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!