工厂(Factory)模式提供了一种创建对象的方式,不需要关心对象的创建细节,我要什么,工厂就给我什么。
接下来我用生产电话的场景进行运用工厂模式。
/**
* @description: 电话
* @author: jiang
*/
public abstract class Phone {
/**
* 准备
*/
abstract void prepare();
/**
* 生产
*/
abstract void produce();
}
/**
* @description: 移动电话
* @author: jiang
*/
public class MobilePhone extends Phone{
@Override
public void prepare(){
System.out.println("准备无线信号发射器");
System.out.println("准备屏幕");
System.out.println("准备主板");
}
@Override
void produce() {
System.out.println("将屏幕安装在主板上");
System.out.println("将无线信号发射器安装在主板上");
System.out.println("安装完毕");
}
}
/**
* @description: 固定电话
* @author: jiang
*/
public class FixedPhone extends Phone{
@Override
public void prepare(){
System.out.println("准备有线信号接口");
System.out.println("准备数字按钮");
System.out.println("准备主板");
}
@Override
void produce() {
System.out.println("将有线信号接口安装在主板上");
System.out.println("将数字按钮安装在主板上");
System.out.println("安装完毕");
}
}
使用new对象方式来创建移动电话和固定电话
public static void main(String[] args) {
//1.我想要一个移动电话
Phone mobilePhone = new MobilePhone();
//准备零件
mobilePhone.prepare();
//安装
mobilePhone.produce();
System.out.println("--------------------------");
//2.我想要一个固定电话
Phone fixedPhone = new FixedPhone();
//准备零件
fixedPhone.prepare();
//安装
fixedPhone.produce();
}
缺点:可读性变差,业务代码本身不需要关心创建的具体步骤
1.使用简单工厂改造
/**
* @description: 简单工厂
* @author: jiang
*/
public class XiaoMiPhoneFactory {
/**
* 创建电话
* @param type
* @return
*/
public Phone createPhone(String type){
if("mobile".equals(type)){
Phone mobilePhone = new MobilePhone();
//准备零件
mobilePhone.prepare();
//安装
mobilePhone.produce();
return mobilePhone;
}else if("fixed".equals(type)){
Phone fixedPhone = new FixedPhone();
//准备零件
fixedPhone.prepare();
//安装
fixedPhone.produce();
return fixedPhone;
}
return null;
}
}
public static void main(String[] args) {
XiaoMiPhoneFactory xiaoMiPhoneFactory = new XiaoMiPhoneFactory();
Phone mobile = xiaoMiPhoneFactory.createPhone("mobile");
Phone fixed = xiaoMiPhoneFactory.createPhone("fixed");
}
优点:将具体的创建步骤放到工厂内部去处理,调用者不需要关心怎么创建,需要哪些必要步骤
缺点:不方便扩展,违背开闭原则,假设我要增加 公用电话 只能修改XiaoMiPhoneFactory类加一个else if
2.使用工厂方法改造
/**
* @description: 公共电话
* @author: jiang
*/
public class PublicPhone extends Phone{
@Override
public void prepare(){
System.out.println("准备磁卡读取器");
System.out.println("准备主板");
}
@Override
public void produce() {
System.out.println("将磁卡读取器安装在主板上");
System.out.println("安装完毕");
}
}
/**
* @description: 抽象电话工厂
* @author: jiang
*/
public abstract class AbstractXiaoMiPhoneFactory {
public abstract Phone createPhone();
}
/**
* @description: 小米移动电话工厂
* @author: jiang
*/
public class XiaoMiMobilePhoneFactory extends AbstractXiaoMiPhoneFactory{
@Override
public Phone createPhone() {
Phone mobilePhone = new MobilePhone();
//准备零件
mobilePhone.prepare();
//安装
mobilePhone.produce();
return mobilePhone;
}
}
/**
* @description: 小米固定电话工厂
* @author: jiang
*/
public class XiaoMiFixedPhoneFactory extends AbstractXiaoMiPhoneFactory{
@Override
public Phone createPhone() {
Phone fixedPhone = new FixedPhone();
//准备零件
fixedPhone.prepare();
//安装
fixedPhone.produce();
return fixedPhone;
}
}
/**
* @description: 小米公共电话工厂
* @author: jiang
*/
public class XiaoMiPublicPhoneFactory extends AbstractXiaoMiPhoneFactory{
@Override
public Phone createPhone() {
Phone publicPhone = new PublicPhone();
//准备零件
publicPhone.prepare();
//安装
publicPhone.produce();
return publicPhone;
}
}
关系图.png
public static void main(String[] args) {
//1.我想要一个移动手机
AbstractXiaoMiPhoneFactory xiaoMiPhoneFactory = new XiaoMiMobilePhoneFactory();
xiaoMiPhoneFactory.createPhone();
//2.我想要一个固定电话
AbstractXiaoMiPhoneFactory xiaoMiFixedPhoneFactory = new XiaoMiFixedPhoneFactory();
xiaoMiFixedPhoneFactory.createPhone();
//3.我想要一个公共电话
AbstractXiaoMiPhoneFactory xiaoMiPublicPhoneFactory = new XiaoMiPublicPhoneFactory();
xiaoMiPublicPhoneFactory.createPhone();
}
优点:当需要增加其他类型的电话时,不需要修改原来的类,不同类型的工厂生产不同类型的电话
缺点:增加系统复杂度,产品单一,假设小米厂商不只是生产手机,还要生产电器,生产车
3.使用抽象工厂改造
新建Car对象
/**
* @description: 汽车
* @author: jiang
*/
public abstract class Car {
/**
* 准备
*/
public abstract void prepare();
/**
* 生产
*/
public abstract void produce();
}
/**
* @description: 跑车
* @author: jiang
*/
public class SportCar extends Car{
@Override
public void prepare(){
System.out.println("准备V8发动机");
System.out.println("准备碳纤维运动套件");
System.out.println("准备车架");
}
@Override
public void produce() {
System.out.println("将V8发动机安装在车架上");
System.out.println("将碳纤维运动套件安装在车架上");
System.out.println("安装完毕");
}
}
/**
* @description: 普通轿车
* @author: jiang
*/
public class OrdinaryCar extends Car{
@Override
public void prepare(){
System.out.println("准备涡轮增压发动机");
System.out.println("准备铝材质套件");
System.out.println("准备车架");
}
@Override
public void produce() {
System.out.println("将涡轮增压发动机安装在车架上");
System.out.println("将铝材质套件安装在车架上");
System.out.println("安装完毕");
}
}
/**
* @description: 小米厂商总工厂
* @author: jiang
*/
public abstract class AbstractXiaoMiFactory {
/**
* 创建电话
* @return
*/
public abstract Phone createPhone();
/**
* 创建汽车
* @return
*/
public abstract Car createCar();
}
/**
* @description: 抽象汽车工厂
* @author: jiang
*/
public abstract class AbstractXiaoMiCarFactory extends AbstractXiaoMiFactory{
@Override
public Phone createPhone() {
return null;
}
public abstract Car createCar();
}
/**
* @description: 抽象电话工厂
* @author: jiang
*/
public abstract class AbstractXiaoMiPhoneFactory extends AbstractXiaoMiFactory{
public abstract Phone createPhone();
@Override
public Car createCar() {
return null;
}
}
/**
* @description: 小米跑车工厂
* @author: jiang
*/
public class XiaoMiSportCarFactory extends AbstractXiaoMiCarFactory {
@Override
public Car createCar() {
Car sportCar = new SportCar();
//准备零件
sportCar.prepare();
//安装
sportCar.produce();
return sportCar;
}
}
/**
* @description: 小米普通轿车工厂
* @author: jiang
*/
public class XiaoMiOrdinaryCarFactory extends AbstractXiaoMiCarFactory {
@Override
public Car createCar() {
Car ordinaryCar = new OrdinaryCar();
//准备零件
ordinaryCar.prepare();
//安装
ordinaryCar.produce();
return ordinaryCar;
}
}
/**
* @description: 小米移动电话工厂
* @author: jiang
*/
public class XiaoMiMobilePhoneFactory extends AbstractXiaoMiPhoneFactory {
@Override
public Phone createPhone() {
Phone mobilePhone = new MobilePhone();
//准备零件
mobilePhone.prepare();
//安装
mobilePhone.produce();
return mobilePhone;
}
}
/**
* @description: 小米固定电话工厂
* @author: jiang
*/
public class XiaoMiFixedPhoneFactory extends AbstractXiaoMiPhoneFactory {
@Override
public Phone createPhone() {
Phone fixedPhone = new FixedPhone();
//准备零件
fixedPhone.prepare();
//安装
fixedPhone.produce();
return fixedPhone;
}
}
抽象工厂关系图.png
public static void main(String[] args) {
//1.我想要一个移动手机
AbstractXiaoMiFactory xiaoMiPhoneFactory = new XiaoMiMobilePhoneFactory();
xiaoMiPhoneFactory.createPhone();
//2.我想要一辆跑车
AbstractXiaoMiFactory xiaoMiSportCarFactory = new XiaoMiSportCarFactory();
xiaoMiSportCarFactory.createCar();
}