【JAVA学习 设计模式】工厂模式

1.分工是程序设计中一个很重要的话题,一个分工明确的Project在后期是很容易拓展的。其实设计模式的核心就是讨论如何更好的分工。工厂模式是明确程序设计中分工的一个经典的方案。

2.首先在面向对象的程序设计中有很多的原则,大概是有六条基本的原则。

(1)OCP原则:也叫开闭原则,就是说在程序设计时对修改是关闭的,对拓展的开放的。这条原则说明了,在编程时,我们可以继承拓展原来的类,但是拒绝修改原来的类。

(2)DIP原则:也叫依赖关系倒转原则,针对接口编程,而不是针对实现编程。

这是其中的两种基本原则。我们先来写一个简单的例子:

首先定义一个Car的接口

package Factory;

public interface Car {
    public void run();
}

然后是这个接口的两个实现:

CarA:

package Factory;

public class CarA implements Car {
    @Override
    public void run() {
        System.out.println("CarA is running!");
    }
}

CarB:

package Factory;

public class CarB implements Car {
    @Override
    public void run() {
        System.out.println("CarB is running!");
    }
}

在主函数里,我们构建A,B的两个对象:

package Factory;
public class Test1 {
    public static void main(String[] args) {
        Car A=new CarA();
        Car B=new CarB();
        A.run();
        B.run();
    }
}

然后调用其中的方法,这是我们一般的写法,但是我们可以看出来,这里有着很大的弊端:就是调用和实现没有分离。作为调用者Tes1,不仅仅要知道接口类,还需要知道两个实现类,这显然分工不明确,因为我需要知道的东西太多了,我现在不想知道这么多东西,就给你一个车的名字,你给我返回一个对应的对象就行了,其他的怎么实现的我就不关心了。

为了实现更高层次的调用与实现分离,可以采用工厂设计模式。工厂顾名思义就是产生产品的东西,所有对象在这里产生,作为调用者,我只需要知道我想要什么和工厂在哪即可,其他的都交给工厂完成。

3.工厂模式分为三种,简单工厂模式,工厂方法模式,抽象工厂。

4.首先是简单工厂模式:这个思路比较简单,就是一个工厂和对应的类交互,调用者和工厂交互:

package Factory;

public class CarFactory {
    public static Car createCar(String carType)
    {
        if(carType.equals("A"))
        {
            return  new CarA();
        }
        else if(carType.equals("B"))
        {
            return new CarB();
        }
        else
        {
            return null;
        }
    }
}

然后Test只需要:

package Factory;

public class Test2 {
    public static void main(String[] args) {
        Car A=CarFactory.createCar("A");
        Car B=CarFactory.createCar("B");
        A.run();
        B.run();
    }
}

这样,调用者就不需要知道如何构建对象,这些细节都交给工厂完成。这种模式也叫做静态工厂模式,但是我们可以看出来,这种模式是很难拓展的,因为如果我现在加了新产品CarC,那么你就需要修改源代码,上面我们说过OCP原则,这是不符合面向对象程序设计的思想的。所以为了克服这一困难,提出了工厂方法模式。

5.工厂方法模式:

首先我们还是定义一个工厂,但是这里我们把它定义成接口:

package FactoryMethod;

public interface CarFactory {
    Car createCar();
}

然后对于每一种产品,我们定义产生这种产品的工厂,这种工厂只需要实现这个接口即可,例如对于CarA,我们定义生产A的工厂:

package FactoryMethod;

public class CarAFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new CarA();
    }
}

其他的也是类似,这时,如果我们需要新加产品C,那么很简单,我们只需要定义C的工厂,在调用者里,我们直接调用对应的工厂方法即可产生我们想要的产品。

6.工厂方法模式虽然克服了简单工厂难以拓展的困境,但是我们可以明显的感受到,需要写的类变得多了。组织结构逐渐变得复杂起来,所以一般不是很严的要求,我们还是可以使用简单工厂来实现调用和实现分离。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值