Java设计模式---工厂模式

想要写出好的,容易复用的,解耦的代码,就必须学习到设计模式,这也正是写文章的意义,本人想把自己学习过的工厂模式进行记录,一方面方便查阅,一方面希望能加深对设计模式的认识。

今天是第一篇,由简单到容易,就记录一下工厂模式。

工厂模式:是创建型模式之一,一种简单的模式,使用工厂模式进行解耦代码,方便扩展程序以及修改程序。
个人理解就是在工厂中,我们可以生产各种各样的商品,他们有一定的共性,比如汽车,小轿车,的士等等,他们都是与车这一个种类,我们就可以将“车”当做一个工厂类进行设计,从而衍生出各种各样的车出来。

首先我们必须先定义一个车的基本特征,我们都可以知道车的共性有4个轮子,后视镜等等,这里就以这两个作为车的基本类型,将其抽象出来,然后我们进行类的设计如下:

public abstract class Che {

    protected void Sheel(){
        System.out.println("车的轮子");
    }
    public void rearviewMmirror(){
        System.out.println("车的后视镜");
    }   
    //输出车的名字
    public abstract void printCarName();
}

上述代码给出了轮子和后视镜的定义,以及抽象了一个方法printCarName去输出我们具体车的名字,我们再定义的士和汽车,代码如下:

汽车
public class Car extends Che {

    @Override
    public void printCarName() {
        System.out.println("这是汽车");

    }

}

小轿车
public class Taxi extends Che{

    @Override
    public void printCarName() {
        // TODO Auto-generated method stub
        System.out.println("这是的士");
    }

}

我们重写了输出名字的方法,分别输出不同车型对应的车的名字,然后我们进行工厂的简单设计:

public abstract class CheFactory {
    /**
     * 工厂的抽象方法,
     * 具体生产什么由子类去决定
     */
    public abstract Che createTheChe();
}

我们抽象使用一个工厂类,并且使用createTheChe()进行生产车,返回的类型就是Che类型。下面是工厂类的两个子类:

//汽车工厂
public class CarFactory extends CheFactory{
    @Override
    public Che createTheChe() {
        return new Car();
    }
}

//的士工厂
public class TaxiFactory extends CheFactory {
    @Override
    public Che createTheChe() {
        return new Taxi();
    }
}

我们进行测试:

public class Main {
    public static void main(String[] args) {
        CheFactory car=new CarFactory();
        CheFactory taxi=new TaxiFactory();

        car.createTheChe().printCarName();
        taxi.createTheChe().printCarName();
    }
}

输出的结果为:

这是汽车
这是的士

上述所示的即为最简单的工厂模式,也可以称为多工厂模式,我们从上方可以看到其实每种车的结构式大体相同的,那么我们是否就不需要定义那么多的工厂来进行设计呢?
这里我们就可以引出简单工厂模式(也称静态工厂模式)
我们重新定义工厂以及实现一个具体的工厂类,请看下述代码:

车工厂类
public abstract class CheFactory {
    /**
     * 工厂的抽象方法,
     * 具体生产什么由子类去决定
     */
    public abstract <T extends Che> T createTheChe(Class<T> class1);
}
//具体工厂类
public class Factory extends CheFactory {

    @Override
    public <T extends Che> T createTheChe(Class<T> class1) {
        Che che=null;
        try {
            che=(Che) Class.forName(class1.getName()).newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return (T) che;
    }
}

我们通过反射的方法实现具体车型的实例化操作,这样只要我们传入类即可实例化各种车型了~。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值