工厂:顾名思义,生产,加工产品的地方
工厂模式:就是在软件中提供专门用来创建对象实例的类(相当于一个加工生产对象的工厂),对所有的new操作进行封装,当要实例化对象的时候,根据传入的参数决定要实例化哪一个对象。
工厂模式包括工厂方法模式和抽象工厂模式。
抽象工厂模式是工厂方法模式的扩展。
工厂方法模式:
我们要创建一个生产不同口味冰淇淋的工厂,首先所有口味的冰淇淋类都会有一个生成冰淇淋的方法,而这个方法就可以抽象为一个接口(IceCreamInterface),让不同口味的冰淇淋类实现该接口,最后还需要一个工厂类,根据传入的参数实例化不同口味的冰淇淋对象。
1. 制作冰淇淋的方法接口
//冰淇淋接口
public interface IceCreamInterface {
//制作冰淇淋的方法
public void createIceCream();
}
2. 实现接口的不同口味的冰淇淋类
//制作菠萝冰淇淋
public class PineappleCream implements IceCreamInterface {
@Override
public void createIceCream() {
System.out.println("生成一个菠萝冰淇淋");
}
}
//制作草莓冰淇淋
public class StrawberryCream implements IceCreamInterface {
@Override
public void createIceCream() {
System.out.println("生成一个草莓冰淇淋");
}
}
3. 冰淇淋工厂类,根据传入的字符串实例化冰淇淋对象
//生成冰淇淋的工厂
public class IceCreamFactory {
//根据传入的name来判断需要创建哪个对象
public IceCreamInterface getIceCream(String name){
if("strawberry".equals(name)){
return new StrawberryCream();
}else if("pineapple".equals(name)){
return new PineappleCream();
}else{
return null;
}
}
}
4. 调用工厂类实例化对象
IceCreamFactory factory1=new IceCreamFactory();
//向上转型
IceCreamInterface iceCream1=factory1.getIceCream("strawberry");
if(iceCream1!=null){
iceCream1.createIceCream();
}
iceCream1=factory1.getIceCream("pineapple");
if(iceCream1!=null){
iceCream1.createIceCream();
}
抽象工厂模式
我们要生产两种类别的冰淇淋,分别是蛋卷冰淇淋和纸杯冰淇淋,同时蛋卷冰淇淋还分手工和机器生产的两种,纸杯同样也分手工和机器的两种,于是我们要生产四种产品类型的冰淇淋(四个生成不同对象的类)。要建立两个工厂,一个是手工工厂用于生产手工冰淇淋(实例化手工产品的对象),一个是机器工厂用于生产机器冰淇淋(实例化机器产品的对象)。
1. 抽象生产纸杯冰淇淋方法为CupCream接口
//纸杯冰淇淋接口
public interface CupCream {
public void createCupCream();
}
2. 实现接口的手工纸杯冰淇淋类和机器纸杯冰淇淋类
//手工纸杯冰淇淋
public class ManualCupCream implements CupCream{
@Override
public void createCupCream() {
System.out.println("生成一个手工纸杯冰淇淋");
}
}
//机器纸杯冰淇淋
public class MachineCupCream implements CupCream{
@Override
public void createCupCream() {
System.out.println("生成一个机器纸杯冰淇淋");
}
}
3. 抽象生产蛋卷冰淇淋方法为EggCream接口
//蛋卷冰淇淋接口
public interface EggCream {
public void createEggCream();
}
4. 实现接口的手工蛋卷冰淇淋类和机器蛋卷冰淇淋类
//手工蛋卷冰淇淋
public class ManualEggCream implements EggCream {
@Override
public void createEggCream() {
System.out.println("生成一个手工蛋卷冰淇淋");
}
}
//机器蛋卷冰淇淋
public class MachineEggCream implements EggCream {
@Override
public void createEggCream() {
// TODO Auto-generated method stub
System.out.println("生成一个机器蛋卷冰淇淋");
}
}
5. 定义包装工厂接口,包括得到蛋卷冰淇淋和纸杯冰淇淋的抽象方法
//包装工厂接口
public interface WrappingFactroy {
public EggCream getEggCream();
public CupCream getCupCream();
}
6. 实现包装工厂接口的手工工厂和机器工厂
//手工生产工厂
public class ManualFactory implements WrappingFactroy{
@Override
public EggCream getEggCream() {
return new ManualEggCream();
}
@Override
public CupCream getCupCream() {
return new ManualCupCream();
}
}
//机器生产工厂
public class MachineFactory implements WrappingFactroy{
@Override
public EggCream getEggCream() {
return new MachineEggCream();
}
@Override
public CupCream getCupCream() {
return new MachineCupCream();
}
}
7. 调用工厂类实例化对象
WrappingFactroy wrapping=new ManualFactory() ;
EggCream eggCream=wrapping.getEggCream();
eggCream.createEggCream();
CupCream cupCream=wrapping.getCupCream();
cupCream.createCupCream();
wrapping=new MachineFactory();
eggCream=wrapping.getEggCream();
eggCream.createEggCream();
cupCream=wrapping.getCupCream();
cupCream.createCupCream();