工厂方法

1.首先给出工厂方法的****定义
定义一个创建对象的接口,让子类决定实例化哪一类,使一个类的实例化延迟到其子类。因为每一个具体产品类对应着一个具体的工厂类,故增加具体产品时只需要增加一个具体工厂类.。工厂方法模式是简单工厂模式的进一步抽象和推广,克服了简单工厂的违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。
2.为什么要用工厂方法模式
工厂方法模式与简单工厂模式的区别在于工厂方法模式比简单工厂模式多出一个抽象工厂接口,每一个具体工厂实现某个具体产品的实现。比如生成每本书都需要许多信息,书名,出版社,生成时间和生成顺序,但是不同的书籍信息要求不确定。
3.简单工厂模式与工厂方法模式的区别
工厂方法模式与简单工厂模式的区别在于工厂方法模式比简单工厂模式多出一个抽象工厂接口,每一个具体工厂实现某个具体产品的实现

4.简单的举个例子:
我们将水果园比作一个工厂,在简单工厂模式下,水果园是一个具体的工厂,直接用来生产各种各样的水果。那么在工厂方法模式下,水果园是一个抽象工厂,那么苹果树,香蕉树等就相当于是具体工厂,生产苹果、香蕉等水果。每有一种新的水果要生产,则需要种植生产这种水果植物,即创建生产具体水果的工厂。
如下图:
在这里插入图片描述
苹果和香蕉的都实现水果接口类中的get()方法,负责生产苹果和香蕉的具体工厂实现水果这个抽象工厂接口。在工厂方法模式下如果想要生产新的水果,即创建新的类。比如生产梨子,需要新建一个梨子类实现水果类的get()方法,创建梨子工厂实现水果工厂来生产梨子。

在这里插入图片描述
接下来我们用代码来解释一下:
首先顶一个水果类:
Fruit(interface):

//水果类
public interface Fruit {
    public void get();
}

Apple类:

//苹果类
public class Apple implements Fruit{
    //实现并重写父类的get()方法
    public void get() {
        System.out.println("采集苹果");
    }
}

4.创建FruitFactory接口、AppleFactory类等

FruitFactory(interface):

public interface FruitFactory {
    public Fruit getFruit();
}

AppleFactory类:

public class AppleFactory implements FruitFactory {
    @Override
    public Fruit getFruit() {
        return new Apple();
    }
}

5.生产水果
MainClass:

public class MainClass {
    public static void main(String[] args){
        //创建苹果工厂
        FruitFactory appleFactory = new AppleFactory();
        //通过苹果工厂生产苹果实例
        Fruit apple = appleFactory.getFruit();
        apple.get();
    //创建香蕉工厂
    FruitFactory bananaFactory = new BananaFactory();
    //通过香蕉工厂生产香蕉实例
    Fruit banana = bananaFactory.getFruit();
    banana.get();
    
    //新添加的梨子工厂
    FruitFactory pearFactory = new PearFactory();
    Fruit pear = pearFactory.getFruit();
    pear.get();
}

}
  这里用到Java面向对象的三大特性之一–多态。在新建工厂时,由FruitFactory接口指向具体的工厂(AppleFactory)。通过具体的工厂生产水果时,由Fruit接口指向具体的实例对象(Apple)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值