工厂模式:
(图来自慕课网)
这是一个生产左偏发型,右偏发型的列子
1.创建接口HairInterface,只有一个方法draw
public interface HairInterface {
public void draw();
}
2.创建LeftHair和RightHair,全部实现HairInterface
(1)创建LeftHair
public class LeftHair implements HairInterface {
@Override
public void draw() {
System.out.println("----左偏发型------");
}
}
(2)创建RightHair
public class RightHair implements HairInterface {
@Override
public void draw() {
System.out.println("----右偏发型------");
}
}
3.创建生产者HairFactory
public class HairFactory {
public HairInterface getHair(String key){
//在工厂内部实现生产,即new对象,而不需要在客户端去生产,客户端只需要告诉工厂要什么产品
if("left".equals(key)){
return new LeftHair();
}else if("right".equals(key)){
return new RightHair();
}else{
return null;
}
}
}
4.客户端获取产品
public class Client {
public static void main(String[] args) {
HairFactory factory = new HairFactory();
//***这里客户端不管要什么类型的产品,都是拿HairInterface接收,这样使逻辑上更清晰
HairInterface hair = factory.getHair("left");
hair.draw();
}
}
抽象工厂模式:
(图来自慕课网)
这是一个生产圣诞/新年女孩,圣诞/新年男孩的例子
1.要生产的产品分为两类Product,男孩、女孩,但是具体还要分圣诞系列、新年系列的男女孩,所以要将男、女孩创建成接口
(1)创建女孩接口
public interface Girl {
public void drawGirl();
}
(2)创建男孩接口
public interface Boy {
public void drawBoy();
}
2.创建圣诞和新年的男女孩,分别实现上面的男、女孩接口
(1)创建圣诞系列女孩
public class MCGirl implements Girl {
@Override
public void drawGirl() {
System.out.println("-----圣诞系列女孩------");
}
}
(2)创建新年系列女孩
public class HNGirl implements Girl {
@Override
public void drawGirl() {
System.out.println("-----新年系列女孩------");
}
}
(3)创建圣诞系列男孩
public class MCBoy implements Boy {
@Override
public void drawBoy() {
System.out.println("----圣诞系列男孩------");
}
}
(4)创建新年系列男孩
public class HNBoy implements Boy {
@Override
public void drawBoy() {
System.out.println("----新年系列男孩------");
}
}
3.开始实现工厂类,因为有两个系列(圣诞、新年系列),所以PersonFactory是接口
(1)创建PersonFactory接口
public interface PersonFactory {
public Girl getGirl();
public Boy getBoy();
}
(2)创建圣诞系列的工厂,实现PersonFactory接口
public class MCFactory implements PersonFactory {
@Override
public Girl getGirl() {
return new MCGirl();
}
@Override
public Boy getBoy() {
return new MCBoy();
}
}
(3)创建新年系列的工厂,实现PersonFactory接口
public class HNFactory implements PersonFactory {
@Override
public Girl getGirl() {
return new HNGirl();
}
@Override
public Boy getBoy() {
return new HNBoy();
}
}
4.创建客户端,可以随意要不同系列的男孩或女孩产品
public class Client {
public static void main(String[] args){
//这里选择哪个系列
PersonFactory factory = new MCFactory();
//这里选择男孩、女孩
Boy boy = factory.getBoy();
boy.drawBoy();
}
}
5.上面的例子对应于抽象工厂的模式类图
总结:
工厂方法是抽象工厂的一种极端情况,抽象工厂是工厂方法的推广情况,其实抽象工厂算是工厂方法应用的集合,多了 《系列》 这个概念。