GOF设计模式-工厂模式

工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。

既然说到工厂模式,简单回顾一下简单工厂模式

在简单工厂模式中,如果我们要添加一个产品,比如日产,那么除了要添加一个日产产品类还要再修改一下case分支,那么这就和开山篇 中的开闭原则冲突了,即对修改关闭,对扩展开放,工厂模式就能很好的解决这个问题。

UML图:

这里写图片描述

  • Car,是产品的抽象类
  • Honda,Mazda,Toyota是具体的产品
  • CarFactory,是工厂抽象类
  • HondaFactory,MazdaFactory,ToyotaFactory是具体的工厂类

左半拉的,产品代码不可以参考简单工厂模式

首先创建一个工厂抽象类

public abstract class Car2Factory {

    public abstract Car createCar();

}

根据产品,创建对应的工厂

public class HondaFactory extends Car2Factory{

    @Override
    public Car createCar() {
        return new Honda();
    }
}
public class MazdaFactory extends Car2Factory {

    @Override
    public Car createCar() {
        return new Mazda();
    }
}
public class ToyotaFactory extends Car2Factory {

    @Override
    public Car createCar() {
        return new Toyota();
    }
}

好了,到此产品,工厂都创建好了,关键的来了,

public class Test {

    public static void main(String[] args) {
        Car2Factory car2Factory = new HondaFactory();
        Car honda = car2Factory.createCar();
        System.out.println(honda.getCar());

        Car2Factory car2Factory1 = new MazdaFactory();
        Car mazda = car2Factory1.createCar();
        System.out.println(mazda.getCar());

        Car2Factory car2Factory2 = new ToyotaFactory();
        Car toyota = car2Factory2.createCar();
        System.out.println(toyota.getCar());
    }
}

好了,目的达到,新建产品的时候,不用再去管什么case分支了,扩展一个产品,再扩展一个产品工厂就好了。

上面其实是每个产品的工厂只生产自己的产品,比如,本田只生产本田的汽车,马自达生产马自达的。那么,大家是不是经常在大街上看见,什么东风XXX,广汽XXX,一汽XXXX,上汽XXXX,拿东风来说,有东风本田,东风日产,东风雪铁龙。。。。

好了,创建一个此类工厂的抽象类,等下用反射生产产品

public abstract class CarFactory {

    public abstract  <T extends Car> T createCar(Class<T> clzz);

}

创建东风工厂

public class DFCarFactory extends CarFactory {

    @Override
    public <T extends Car> T createCar(Class<T> clzz) {
        Car car = null;
        String classname=clzz.getName();

        try {

            // 通过反射来生产不同厂家的汽车
            car = (Car) Class.forName(classname).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return (T) car;
    }

}

好了,测一下

public class Test {

    public static void main(String[] args) {
        CarFactory carFactory = new DFCarFactory();
        Honda ca = carFactory.createCar(Honda.class);
        System.out.println(ca.getCar());
        Mazda ca1 = carFactory.createCar(Mazda.class);
        System.out.println(ca1.getCar());
        Toyota ca2 = carFactory.createCar(Toyota.class);
        System.out.println(ca2.getCar());
    }


}

OK,没问题,产品生产没问题。

代码地址:https://github.com/mazh1992/model/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值