设计模式学习笔记(三)--工厂模式

Factory (工厂)模式

工厂模式的定义:
假如你有一个类A,要实例化这个类,最简单的方法就是A a=new A()。如果要做一 些初始化的工作,通常会把这些操作写在A的构造方法里例如:A a =new A(parmeter);
但是,也许有很多的初始化内容,如果把所有内容都放在构造函数里面,就很不合适。在这种情境下就可以使用工厂模式,协助完成一系列初始化工作。

工厂模式通常有3种形态:简单工厂模式、工厂方法模式、抽象工厂模式。
下面就以农产品管理系统的集中水果和蔬菜(苹果、橘子、葡萄、番茄、冬瓜、胡萝卜)为例简要介绍这三种形态的工厂

一、Simple Factory(简单工厂)模式

SimpleFactory模式的结构如图
这里写图片描述
SimpleFactory模式的目的是专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有相同的父类

代码实现

//定义水果(Fruit)接口
public interface Fruit {
        public void grow();  //水果是被栽培的
        public  void expressedJuice();//水果是可以榨汁的
}
//定义苹果类实现水果接口
public class Apple implements Fruit {
    @Override
    public void grow() {
        System.out.println("栽培苹果");
    }
    @Override
    public void expressedJuice() {
        System.out.println("榨苹果汁");
    }
}
//定义葡萄类实现水果接口
public class Grape implements Fruit{
    @Override
    public void grow() {
        System.out.println("栽培葡萄");
    }
    @Override
    public void expressedJuice() {
        System.out.println("榨葡萄汁");
    }
}

//定义橙子类实现水果接口
public class Orange implements Fruit{
    @Override
    public void grow() {
        System.out.println("栽培橘子");     
    }
    @Override
    public void expressedJuice() {
        System.out.println("榨橙汁");      
    }
}
//定义水果工厂(FruitFactory)类
public class FruitFactory {
        public Fruit trafficFruit(int which) {
            if(which==1) {//如果是1,则返回苹果实例
                return new Apple();
            }else if(which==2){//如果是2,则返回葡萄实例
                return new Grape();
            }else if (which==3) {//如果是3,则返回橙子实例
                return new Orange();
            }else {
                return null;
            }       
        }
}
//编写客户(Client)类
public class Client {
    public static void main(String[] args) {
                FruitFactory fruit = new FruitFactory();//实例化水果工厂,可以开始运输水果了
                fruit.trafficFruit(1).expressedJuice();//调用苹果的expressedJuice()方法,用于榨苹果汁
                fruit.trafficFruit(2).expressedJuice();//调用葡萄的expressedJuice()方法,用于榨葡萄汁
                fruit.trafficFruit(3).expressedJuice();//调用橙子的expressedJuice()方法,用于榨橙汁
    }
}

输出结果:
这里写图片描述

从上面代码可以看出,当要运送水果时,只需向水果工厂(FruitFactory)请求就可以了。水果工厂在街道请求后,会自行判断创建和提供哪种水果。

二、Factory Method(工厂方法)模式

对于简单工厂模式,如果要引增加一种或者几种水果就比较麻烦。这是除了要定义及个新增的水果类外,还必须修改水果工厂和客户端。从而可以看出比较麻烦,Simple Factory 模式开放性比较差。
要解决这种开放性比较差的问题,需要用到下面介绍的Factory Method(工厂方法模式)

Factory Method模式的结构如图
这里写图片描述

代码实现

//将水果工厂定义为接口而不是类
public interface FruitFactory {
  public Fruit trafficFruit();
}

//定义运送苹果类(TrafficApple)实现水果工厂(FruitFactory)接口
public class TrafficApple implements FruitFactory{
    public Fruit trafficFruit() {
        return new Apple();
    }
}

//定义运送葡萄类(TrafficApple)实现水果工厂(FruitFactory)接口
public class TrafficGrape implements FruitFactory{
    public Fruit trafficFruit() {
        return new Grape();
    }
}

//定义运送橙子类(TrafficApple)实现水果工厂(FruitFactory)接口
public class TrafficOrange implements   FruitFactory{   
    public Fruit trafficFruit() {
        return new Orange();
    }
}

//客户类
public class Client {

    public static void main(String[] args) {
        TrafficApple traffic = new TrafficApple();
        //开始运送苹果
        traffic.trafficFruit().expressedJuice();
        //调用橙子的expressedJuice()方法,用于榨苹果汁
    }
}

测试结果:
这里写图片描述
从上面的代码可以看出,工厂模式的核心在于一个抽象工厂类,它允许许多具体类从抽象工厂类中继承其创建行为。

三、Abstract Factory 模式

Factory Method模式针对只是一种类别(Fruit),如果还要运送蔬菜就不行了。在这种情况下,必须用到下面将要介绍的Abstract Factory(抽象工厂模式)。

这里写图片描述

代码实现

//定义一个蔬菜(Vegetable)接口
public interface Vegetable {
    public void grow();//蔬菜是种植的
    public void cook();//蔬菜是用来烹调的
}
//定义冬瓜(WhiteGourd)类实现蔬菜接口
public class WhiteGourd implements Vegetable {
    @Override
    public void grow() {
        System.out.println("种冬瓜");
    }
    @Override
    public void cook() {
        System.out.println("煮冬瓜");
    }
}
//定义胡萝卜(Carrot)类实现蔬菜接口

public class Carrot implements  Vegetable{

    @Override
    public void grow() {
        System.out.println("种胡萝卜");
    }
    @Override
    public void cook() {
        System.out.println("煮胡萝卜");     
    }

}
//定义番茄(Tomato)类实现蔬菜接口
public class Tomato implements Vegetable {
    @Override
    public void grow() {
        System.out.println("种番茄");      
    }
    @Override
    public void cook() {
        System.out.println("煮番茄");      
    }
}
//定义运送工厂接口
public class TrafficFactory implements   ITrafficFactory {

    @Override
    public Fruit trafficFruit(Fruit whichFruit) {
        return whichFruit;
    }
    @Override
    public Vegetable trafficVegetable(Vegetable whichVegetable) {
        return whichVegetable;
    }
}


//定义运送工厂(ITrafficFactory)类实现运送工厂接口(TrafficFactory)
public class TrafficFactory implements   ITrafficFactory {
    @Override
    public Fruit trafficFruit(Fruit whichFruit) {
        return whichFruit;
    }
    @Override
    public Vegetable trafficVegetable(Vegetable whichVegetable) {
        return whichVegetable;
    }
}
//编写客户类
public class Client {
    public static void main(String[] args) {
        Fruit orange = new Orange();//橙子实例
        Vegetable carrot= new Carrot();//胡萝卜实例
        TrafficFactory factory = new TrafficFactory();//运送工厂实例
        factory.trafficFruit(orange).expressedJuice();//运送橙子,榨橙子
        factory.trafficVegetable(carrot).cook();//运送胡萝卜,煮胡萝卜
    }
}

测试结果:
这里写图片描述
Abstract Factory 模式只需向客户端提供一个接口,使得客户端在不必指定运送农产品的具体类的情况下,创建多个类型中的产品对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值