工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。
目录
简单工厂模式
先说简单工厂模式,简单工厂方法包含一个从类层次结构中选择初始类的业务逻辑
客户类不直接创建产品类,客户类只作为对象的消费者,简单工厂模式实现了责任分离,客户类不负责创建类的对象的责任。
UML图:
举一个例子更好明白这三个模式,卖牛奶的例子。
牛奶种类:蒙牛牛奶和伊利牛奶。
public interface Mike {
public String make();
}
public class MengNiuMilk implements Mike{
@Override
public String make() {
return "制作蒙牛牛奶";
}
}
public class YiLiMilk implements Mike {
@Override
public String make() {
return "制作伊利牛奶";
}
}
public class MikeFactory {
public Mike getMike(String mikeName){
if("蒙牛牛奶".equals(mikeName)){
return new MengNiuMilk();
}
if("伊利牛奶".equals(mikeName)){
return new YiLiMilk();
}
return null;
}
}
//测试
public class Test {
public static void main(String[] args) {
MikeFactory mikeFactory = new MikeFactory();
String name = mikeFactory.getMike("蒙牛牛奶").make();
System.out.println(name);
System.out.println(mikeFactory.getMike("伊利牛奶").make());
}
}
输出:
制作蒙牛牛奶
制作伊利牛奶
工厂模式
在简单工厂模式的工厂类中必须知道怎样创建每个子类的对象,所以在每当增加产品类的时候,或者需要修改工厂类的代码,不符合开闭原则。导致该模式不符合开闭原则的原因是工厂方法只是一个实体类,每当有新产品加入时,必须在工厂类中修改条件语句。所以引入了工厂模式,将一个接口作为超类,产品类相同的类层次结构产生创建者类结构,各自负责创建相应产品。
UML图:
这个例子和上面一样,但是需要添加AbstractFactory接口,不同的产品工厂实现这个接口。
工厂种类:伊利工厂,蒙牛工厂。
public interface AbstractFactory {
public Mike mikeMake();
}
public class YiLiFactory implements AbstractFactory {
@Override
public Mike mikeMake() {
return new YiLiMilk();
}
}
public class MengNiuFactory implements AbstractFactory {
@Override
public Mike mikeMake() {
return new MengNiuMilk();
}
}
//测试
public class Test {
public static void main(String[] args) {
YiLiFactory yiLiFactory = new YiLiFactory();
System.out.println(yiLiFactory.mikeMake().make());
MengNiuFactory mengNiuFactory = new MengNiuFactory();
System.out.println(mengNiuFactory.mikeMake().make());
}
}
输出:
制作伊利牛奶
制作蒙牛牛奶
抽象工厂模式
上面两种模式不管工厂怎么拆分抽象,都只是针对一类产品牛奶Milk
,如果要生成另一种产品奶粉 PowderedMilk
,应该怎么表示呢?
最简单的方式是把2中介绍的工厂方法模式完全复制一份,不过这次生产的是奶粉。也就是说我们要完全复制和修改牛奶生产管理的所有代码,这样并不利于扩展和维护。
抽象工厂模式通过在AbstarctFactory
中增加创建产品的接口,并在具体子工厂中实现新加产品的创建。
UML图:
之前面对的是同一类产品,现在加另一类产品:奶粉。
新增奶粉种类:伊利奶粉,蒙牛奶粉。
public interface PowderedMilk {
public String make();
}
public class MengNiuPowderedMilk implements PowderedMilk {
@Override
public String make() {
return "蒙牛奶粉";
}
}
public class YiLiPowderedMilk implements PowderedMilk {
@Override
public String make() {
return "伊利奶粉";
}
}
public class MengNiuFactory implements AbstractFactory {
@Override
public Mike mikeMake() {
return new MengNiuMilk();
}
@Override
public PowderedMilk powderedMilkMake() {
return new MengNiuPowderedMilk();
}
}
public class YiLiFactory implements AbstractFactory {
@Override
public Mike mikeMake() {
return new YiLiMilk();
}
@Override
public PowderedMilk powderedMilkMake() {
return new YiLiPowderedMilk();
}
}
//测试
public class Test {
public static void main(String[] args) {
YiLiFactory yiLiFactory = new YiLiFactory();
System.out.println(yiLiFactory.mikeMake().make());
System.out.println(yiLiFactory.powderedMilkMake().make());
MengNiuFactory mengNiuFactory = new MengNiuFactory();
System.out.println(mengNiuFactory.mikeMake().make());
System.out.println(mengNiuFactory.powderedMilkMake().make());
}
}
输出:
制作伊利牛奶
伊利奶粉
制作蒙牛牛奶
蒙牛奶粉