Java工厂模式

首先先看一下抽象产品和具体产品类(Product)


药品类

package com;

/**
 * 药品
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public abstract class Medicine {
    public abstract void getName();
    public abstract void getNum();
}

西药类

package com;

/**
 * 西药
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public class XMedicine extends Medicine {
    @Override
    public void getName() {
        System.out.println("我是西药");
    }

    @Override
    public void getNum() {
        System.out.println("西药的数量为2");
    }
}

中药类

package com;

/**
 * 中药
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public class ZMedicine extends Medicine {
    @Override
    public void getName() {
        System.out.println("我是中药");
    }

    @Override
    public void getNum() {
        System.out.println("中药的数量为2");
    }
}

仪器类

package com;

/**
 * 仪器
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public abstract class Machine {
    public abstract void getName();
    public abstract void getNum();
}

西药仪器类

package com;

/**
 * 西药仪器
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public class XMachine extends Machine{
    @Override
    public void getName() {
        System.out.println("我是西药仪器");
    }

    @Override
    public void getNum() {
        System.out.println("西药仪器的数量为3");
    }
}

中药仪器类

package com;

/**
 * 中药仪器
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public class ZMachine extends Machine{
    @Override
    public void getName() {
        System.out.println("我是中药仪器");
    }

    @Override
    public void getNum() {
        System.out.println("中药仪器的数量为3");
    }
}

1、简单工厂模式

工厂类

package com.design;

import com.XMedicine;
import com.ZMedicine;

/**
 * 简单工厂类
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public class Factory {

    public static XMedicine xNewInstance() {
        return new XMedicine();
    }

    public static ZMedicine zNewInstance() {
        return new ZMedicine();
    }
}

测试类

package com.design;

import com.XMedicine;
import com.ZMedicine;

/**
 * 简单工厂测试类
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public class FactoryTest {
    public static void main(String[] arg) {
        XMedicine xMedicine = Factory.xNewInstance();
        ZMedicine zMedicine = Factory.zNewInstance();

        xMedicine.getName();
        xMedicine.getNum();
        zMedicine.getNum();
        zMedicine.getName();
    }
}

2、工厂方法模式

抽象工厂类

package com.design1;

import com.Medicine;

/**
 * description
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public abstract class Factory {
    public abstract Medicine newInstance();
}

西药工厂类

package com.design1;

import com.Medicine;
import com.XMedicine;

/**
 * description
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public class XMedicineFactory extends Factory{
    @Override
    public Medicine newInstance() {
        return new XMedicine();
    }
}

中药工厂类

package com.design1;

import com.Medicine;
import com.ZMedicine;

/**
 * description
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public class ZMedicineFactory extends Factory{
    @Override
    public Medicine newInstance() {
        return new ZMedicine();
    }
}

测试类

package com.design1;

import com.Medicine;

/**
 * 工厂方法测试类
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public class FactoryMethodTest {

    public static void main(String[] arg) {
        XMedicineFactory xMedicineFactory = new XMedicineFactory();
        Medicine xMedicine = xMedicineFactory.newInstance();
        xMedicine.getName();
        xMedicine.getNum();

        ZMedicineFactory zMedicineFactory = new ZMedicineFactory();
        Medicine zMedicine = zMedicineFactory.newInstance();
        zMedicine.getNum();
        zMedicine.getName();
    }
}

3、抽象工厂模式

抽象工厂类

package com.design2;

import com.Machine;
import com.Medicine;

/**
 * description
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public abstract class Factory {
    public abstract Medicine medicineNewInstance();
    public abstract Machine machineNewInstance();
}

西药工厂类

package com.design2;

import com.Machine;
import com.Medicine;
import com.XMachine;
import com.XMedicine;

/**
 * description
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public class XMedicineFactory extends Factory{
    @Override
    public Medicine medicineNewInstance() {
        return new XMedicine();
    }

    @Override
    public Machine machineNewInstance() {
        return new XMachine();
    }
}

中药工厂类

package com.design2;

import com.Machine;
import com.Medicine;
import com.ZMachine;
import com.ZMedicine;

/**
 * description
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public class ZMedicineFactory extends Factory{
    @Override
    public Medicine medicineNewInstance() {
        return new ZMedicine();
    }

    @Override
    public Machine machineNewInstance() {
        return new ZMachine();
    }
}

测试类

package com.design2;

import com.Machine;
import com.Medicine;

/**
 * 抽象工厂方法测试类
 *
 * @author ZHANGHAOHAO089
 * @date 2017/12/13
 */

public class AbstractFactoryTest {
    public static void main(String[] arg) {
        ZMedicineFactory zMedicineFactory = new ZMedicineFactory();
        Medicine zMedicine = zMedicineFactory.medicineNewInstance();
        Machine zMachine = zMedicineFactory.machineNewInstance();
        zMedicine.getName();
        zMedicine.getNum();
        zMachine.getName();
        zMachine.getNum();

        XMedicineFactory xMedicineFactory = new XMedicineFactory();
        Medicine xMedicine = xMedicineFactory.medicineNewInstance();
        Machine xMachine = xMedicineFactory.machineNewInstance();
        xMedicine.getName();
        xMedicine.getNum();
        xMachine.getName();
        xMachine.getNum();
    }
}

小结:
1、简单工厂模式:只是简单的生产产品,当有额外的产品需要生产,必须修改工厂类。扩展比较繁琐,后期代码比较混乱。
2、工厂方法模式:根据不同的产品,有自己的具体工厂实现类,当有额外的产品需要生产,只需要增加新工厂即可,易扩展。
3、抽象工厂模式:针对多个相似的厂生产多个相似的产品,有产品群的概念。工厂方法是单一的产品。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java工厂模式是一种创建对象的设计模式,它提供了一种将对象的创建与使用分离的方式。通过使用工厂模式,我们可以通过调用工厂类的方法来创建对象,而不需要直接使用new关键字实例化对象。 在Java中,工厂模式通常包括以下几个角色: 1. 抽象产品(Product):定义了产品的接口,是具体产品类的父类或接口。 2. 具体产品(Concrete Product):实现了抽象产品接口的具体类。 3. 抽象工厂(Abstract Factory):定义了创建产品的接口,可以是抽象类或接口。 4. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品的对象。 下面是一个简单的Java工厂模式实例: 首先,我们定义一个抽象产品接口(Product): ```java public interface Product { void use(); } ``` 然后,我们定义两个具体产品类(Concrete Product)实现抽象产品接口: ```java public class ConcreteProductA implements Product { @Override public void use() { System.out.println("使用产品A"); } } public class ConcreteProductB implements Product { @Override public void use() { System.out.println("使用产品B"); } } ``` 接下来,我们定义一个抽象工厂接口(Abstract Factory): ```java public interface Factory { Product createProduct(); } ``` 然后,我们定义两个具体工厂类(Concrete Factory)实现抽象工厂接口: ```java public class ConcreteFactoryA implements Factory { @Override public Product createProduct() { return new ConcreteProductA(); } } public class ConcreteFactoryB implements Factory { @Override public Product createProduct() { return new ConcreteProductB(); } } ``` 最后,我们可以使用具体工厂来创建具体产品对象: ```java public class Main { public static void main(String[] args) { Factory factoryA = new ConcreteFactoryA(); Product productA = factoryA.createProduct(); productA.use(); Factory factoryB = new ConcreteFactoryB(); Product productB = factoryB.createProduct(); productB.use(); } } ``` 这样,通过工厂模式,我们可以通过调用具体工厂的方法来创建具体产品的对象,而不需要直接使用new关键字实例化对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值