工厂模式在Java中分为三类:
        1)简单工厂模式(Simple Factory)

        2)工厂方法模式(Factory Method)

        3)抽象工厂模式(Abstract Factory)

1)简单工厂模式(Simple Factory)

所有类交给工厂来创建。

1.抽象产品角色

public abstract class Poker {
	//抽象方法
	public abstract void SealCard();
	
}

2.工厂类角色

public class SpadeJ extends Poker{
	//实现抽象方法
	public void SealCard() {
		System.out.println("制作一张黑桃J");
	}
}

3.工厂类角色

public class SimpleFactory {
	public static Object getInstance(String className){
		Object instance = null;
		try {
		    //根据类名获取该类
			Class cls = Class.forName(className);
			//获取该类实例
			instance = cls.newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return instance;
	}
}

测试:

public class TestSF {
	public static void main(String[] args) {
		Poker p = (Poker)StaticFactory.getInstance(SpadeJ.class.getName());
		p.SealCard();
	}
}

执行结果:

制作一张黑桃J

2)工厂方法模式(Factory Method)

工厂方法模式使用继承自抽象工厂角色的多个子类来代替简单工厂模式中的“上帝类”,制作A到K的方法交给红桃,黑桃,方块,梅花类完成。

1.抽象方法:

public interface Poker {
	//接口方法,制作A到K
	public void SealA();
	public void Seal2();
	public void Seal3();
	public void Seal4();
	public void Seal5();
	public void Seal6();
	public void Seal7();
	public void Seal8();
	public void Seal9();
	public void Seal10();
	public void SealJ();
	public void SealQ();
	public void SealK();
}

2.分类后具体角色:

public class Club implements Poker{
	public void SealA() {
		System.out.println("制作一张方块A");
	}
	public void Seal2() {
		System.out.println("制作一张方块2");
	}
	public void Seal3() {
		System.out.println("制作一张方块3");
	}
	public void Seal4() {
		System.out.println("制作一张方块4");
	}
	public void Seal5() {
		System.out.println("制作一张方块5");
	}
	public void Seal6() {
		System.out.println("制作一张方块6");
	}
	public void Seal7() {
		System.out.println("制作一张方块7");
	}
	public void Seal8() {
		System.out.println("制作一张方块8");
	}
	public void Seal9() {
		System.out.println("制作一张方块9");
	}
	public void Seal10() {
		System.out.println("制作一张方块10");
	}
	public void SealJ() {
		System.out.println("制作一张方块J");
	}
	public void SealQ() {
		System.out.println("制作一张方块Q");
	}
	public void SealK() {
		System.out.println("制作一张方块K");
	}
}

 

测试:

public class TestFM {
	public static void main(String[] args) {
		Poker p = new Club();
		p.SealA();
	}
}

执行结果:制作一张方块A

3)抽象工厂模式(Abstract Factory)

不单纯制作扑克,同时增加制作麻将。在抽象工厂模式中,抽象产品 (AbstractProduct) 可能是一个或多个,从而构成一个或多个产品族(Product Family)。 在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。

1.抽象工厂:(选择制作扑克还是麻将)

public interface BoardGames {

	public Poker createPoker(String pokerColors);
	
	public Mahjong createMahjong(String mahjongColors);
	
}

2.具体工厂:

public class GetGameList implements BoardGames{

	public Poker createPoker(String pokerColors) {
		Poker p = null;
		if(pokerColors.equals("Club")){
			p = new Club();
		}else if(pokerColors.equals("Spade")){
			p = new Spade();
		}else if(pokerColors.equals("Heart")){
			p = new Heart();
		}else if(pokerColors.equals("Diamond")){
			p = new Diamond();
		}
		return p;
	}

	public Mahjong createMahjong(String mahjongColors) {
		return new Mahjong();
	}
 
}

3.抽象方法:(如同工厂方法模式)

public  interface Poker {
	//接口方法,卡上涂A到K
	public void SealA();
	public void Seal2();
	public void Seal3();
	public void Seal4();
	public void Seal5();
	public void Seal6();
	public void Seal7();
	public void Seal8();
	public void Seal9();
	public void Seal10();
	public void SealJ();
	public void SealQ();
	public void SealK();
}

4.具体实现:(如同工厂方法模式)

public class Club implements Poker{
	public void SealA() {
		System.out.println("制作一张方块A");
	}
	public void Seal2() {
		System.out.println("制作一张方块2");
	}
	public void Seal3() {
		System.out.println("制作一张方块3");
	}
	public void Seal4() {
		System.out.println("制作一张方块4");
	}
	public void Seal5() {
		System.out.println("制作一张方块5");
	}
	public void Seal6() {
		System.out.println("制作一张方块6");
	}
	public void Seal7() {
		System.out.println("制作一张方块7");
	}
	public void Seal8() {
		System.out.println("制作一张方块8");
	}
	public void Seal9() {
		System.out.println("制作一张方块9");
	}
	public void Seal10() {
		System.out.println("制作一张方块10");
	}
	public void SealJ() {
		System.out.println("制作一张方块J");
	}
	public void SealQ() {
		System.out.println("制作一张方块Q");
	}
	public void SealK() {
		System.out.println("制作一张方块K");
	}
}

测试:

public class TestAF {
	public static void main(String[] args) {
		BoardGames bg = new GetGameList();
		bg.createPoker("Club").SealA();
	}
}

执行结果:制作一张方块A。