设计模式之工厂模式

0. 概述

工厂模式定义了一个创建对象的接口来创建对象,用工厂方法代替new操作。但是由子类决定要实例化的类是哪一个。工厂方法把实例化的工作推迟到子类中去实现。工厂模式包括工厂方法模式和抽象工厂模式,抽象工厂模式是工厂方法模式的扩展。

工厂模式适用场景:(1)有一组类似的对象需要创建;(2)在编码时不能预见需要创建哪种类的实例;(3)考虑系统扩展性,松耦合,降低对象之间的依赖关系。

1. 工厂方法模式

假如你有一家蛋糕店,售卖两种风味蛋糕。

//蛋糕抽象类
public abstract class Cake {
	public abstract void getCake();
}
//草莓风味蛋糕
public class StrawberryCake extends Cake {
	public void getCake() {
		System.out.println("This is strawberry cake.");
	}
}
//芒果风味蛋糕
public class MangoCake extends Cake {
	public void getCake() {
		System.out.println("This is mango cake.");
	}
}
//蛋糕工厂类
public class CakeFactory {
	public Cake createCake(String type) {
		if ("strawberry".equals(type)) {
			return new StrawberryCake();
		} else if ("mango".equals(type)){
			return new MangoCake();
		}
		return null;
	}
}
public class DemoTest {
	public static void main(String[] args) {
		CakeFactory factory = new CakeFactory();
		
		//创建草莓风味蛋糕
		Cake strawberryCake = factory.createCake("strawberry");
		strawberryCake.getCake();
		
		//创建芒果风味蛋糕
		Cake mangoCake = factory.createCake("mango");
		mangoCake.getCake();
	}
}

2. 抽象工厂模式

随着市场需求的不断变化,冰淇淋逐渐受到顾客的青睐,蛋糕店准备制作销售冰淇淋。同样有草莓风味冰淇淋和芒果风味冰淇淋两种产品。这时就需要不同的工厂,负责产生不同风味的产品。我们需要将工厂类抽象化,草莓风味工厂和芒果风味工厂继承这个抽象工厂类。
//冰淇淋抽象类
public abstract class Cream {
	public abstract void getCream();
}
//草莓风味冰淇淋
public class StrawberryCream extends Cream {
	public void getCream() {
		System.out.println("This is strawberry ice cream.");
	}
}
//芒果风味冰淇淋
public class MangoCream extends Cream {
	public void getCream() {
		System.out.println("This is mango ice cream.");
	}
}
//抽象工厂类
public abstract class AbstractFactory {
	public abstract Cake createCake();
	public abstract Cream createCream();
}
//草莓风味工厂类
public class StrawberryFactory extends AbstractFactory {
	public Cake createCake() {
		return new StrawberryCake();
	}
	
	public Cream createCream() {
		return new StrawberryCream();
	}
}
//芒果风味工厂类
public class MangoFactory extends AbstractFactory {
	public Cake createCake() {
		return new MangoCake();
	}

	public Cream createCream() {
		return new MangoCream();
	}
}
public class DemoTest {
	public static void main(String[] args) {
		//创建草莓风味蛋糕
		AbstractFactory SBFactory = new StrawberryFactory();
		Cake strawberryCake = SBFactory.createCake();
		strawberryCake.getCake();
		
		//创建芒果风味冰淇淋
		AbstractFactory MGFactory = new MangoFactory();
		Cream mangoCream = MGFactory.createCream();
		mangoCream.getCream();
	}
}

















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值