抽象工厂模式
抽象工厂模式也就是不仅生产鼠标,还可以生产键盘等其它配件。
也就是说 PcFactory 厂商是个父类,有生产鼠标,生产键盘两个接口。
戴尔工厂、惠普工厂分别继承它,可以分别生产戴尔鼠标+戴尔键盘,和惠普鼠标+惠普键盘。
创建工厂时,由戴尔工厂或者惠普工厂创建。
后续工厂.生产鼠标()则生产鼠标,工厂.生产键盘()则生产键盘。
实现:
- mouse基础类
/**
* 鼠标抽象类
*
* @author liuyuan
* @version BaseMouse.java, v 0.1 2020-04-12 11:21
*/
public abstract class BaseMouse {
/**
* 生产鼠标的抽象方法
*/
public abstract void sayHi();
}
/**
* 戴尔实现类
*
* @author liuyuan
* @version DellMouse.java, v 0.1 2020-04-12 11:23
*/
public class DellMouse extends BaseMouse {
@Override
public void sayHi() {
System.out.println("dell 生产鼠标~");
}
}
/**
* 惠普实现类
*
* @author liuyuan
* @version HpMouse.java, v 0.1 2020-04-12 11:23
*/
public class HpMouse extends BaseMouse {
@Override
public void sayHi() {
System.out.println("HP 生产鼠标~");
}
}
- keybo基础类
/**
* 键盘抽象类
*
* @author liuyuan
* @version BaseKeybo.java, v 0.1 2020-04-12 11:21
*/
public abstract class BaseKeybo {
/**
* 生产键盘的抽象方法
*/
public abstract void sayHi();
}
/**
* @author liuyuan
* @version DellKeybo.java, v 0.1 2020-04-12 11:43
*/
public class DellKeybo extends BaseKeybo {
@Override
public void sayHi() {
System.out.println("dell 生产键盘~");
}
}
/**
* @author liuyuan
* @version HpKeybo.java, v 0.1 2020-04-12 11:43
*/
public class HpKeybo extends BaseKeybo {
@Override
public void sayHi() {
System.out.println("HP 生产键盘~");
}
}
- factory工厂类
import com.example.designmode.factory.absfactory.keybo.BaseKeybo;
import com.example.designmode.factory.factorymethod.mouse.BaseMouse;
/**
* 工厂抽象类
*
* @author liuyuan
* @version BasePcFactory.java, v 0.1 2020-04-12 11:25
*/
public abstract class BasePcFactory {
public abstract BaseMouse greatMouse();
public abstract BaseKeybo greatKeybo();
}
import com.example.designmode.factory.absfactory.keybo.BaseKeybo;
import com.example.designmode.factory.absfactory.keybo.DellKeybo;
import com.example.designmode.factory.factorymethod.mouse.BaseMouse;
import com.example.designmode.factory.factorymethod.mouse.DellMouse;
/**
* @author liuyuan
* @version DellFactory.java, v 0.1 2020-04-12 11:36
*/
public class DellFactory extends BasePcFactory {
@Override
public BaseMouse greatMouse() {
return new DellMouse();
}
@Override
public BaseKeybo greatKeybo() {
return new DellKeybo();
}
}
import com.example.designmode.factory.absfactory.keybo.BaseKeybo;
import com.example.designmode.factory.absfactory.keybo.HpKeybo;
import com.example.designmode.factory.factorymethod.mouse.BaseMouse;
import com.example.designmode.factory.factorymethod.mouse.HpMouse;
/**
* @author liuyuan
* @version HpFactory.java, v 0.1 2020-04-12 11:36
*/
public class HpFactory extends BasePcFactory {
@Override
public BaseMouse greatMouse() {
return new HpMouse();
}
@Override
public BaseKeybo greatKeybo() {
return new HpKeybo();
}
}
- 测试
/**
* fshows.com
* Copyright (C) 2013-2020 All Rights Reserved.
*/
package com.example.designmode.factory.absfactory;
import com.example.designmode.factory.absfactory.factory.BasePcFactory;
import com.example.designmode.factory.absfactory.factory.DellFactory;
import com.example.designmode.factory.absfactory.factory.HpFactory;
/**
* 抽象工厂模式
*
* @author liuyuan
* @version Test.java, v 0.1 2020-04-12 11:48
*/
public class Test {
public static void main(String[] args) {
System.out.println("~抽象工厂模式~");
BasePcFactory pcFactory = new DellFactory();
// dell 生产键盘~
pcFactory.greatKeybo().sayHi();
// dell 生产鼠标~
pcFactory.greatMouse().sayHi();
pcFactory = new HpFactory();
// HP 生产鼠标~
pcFactory.greatMouse().sayHi();
// HP 生产键盘~
pcFactory.greatKeybo().sayHi();
}
}
增加一个工厂怎么实现?
假设我们增加华硕工厂,则我们需要增加华硕工厂,和戴尔工厂一样,继承 PC 厂商。
之后创建华硕鼠标,继承鼠标类。创建华硕键盘,继承键盘类即可。
增加一个产品怎么实现?
假设我们增加耳麦这个产品,则首先我们需要增加耳麦这个父类,再加上戴尔耳麦,惠普耳麦这两个子类。
之后在PC厂商这个父类中,增加生产耳麦的接口。最后在戴尔工厂,惠普工厂这两个类中,分别实现生产戴尔耳麦,惠普耳麦的功能。