設(shè)計(jì)模式之工廠模式
1 簡單工廠
簡單工廠嚴(yán)格來說不屬于23種設(shè)計(jì)模式的一種,其只是將創(chuàng)建對象的過程封裝到了方法之中
下面是簡單工廠的具體實(shí)例
創(chuàng)建一個(gè)Animal接口,定義一個(gè)公共方法
public interface IAnimal {
void eat();
}
創(chuàng)建Animal的實(shí)現(xiàn)類
Bird.class
public class Bird implements IAnimal{
@Override
public void eat(){
System.out.println("bird eating...");
}
}
Cat.class
public class Cat implements IAnimal{
@Override
public void eat(){
System.out.println("cat eating...");
}
}
創(chuàng)建工廠類AnimalFactory
public class AnimalFactory {
public static IAnimal instance(Class<?> clazz){
if(clazz == null) return null;
return instance(clazz.getName());
}
private static IAnimal instance(String name){
if(name == null || "".equals(name)) return null;
try {
return (IAnimal)Class.forName(name).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
測試案例
public class Main {
public static void main(String[] args) {
IAnimal animal = AnimalFactory.instance(Cat.class);
animal.eat();
}
}
輸出結(jié)果
cat eating...
2 工廠方法
當(dāng)我們需要在創(chuàng)建對象的前后執(zhí)行一些不同的業(yè)務(wù)邏輯,以上代碼就需要做出很大的變動。
工廠方法模式針對每一個(gè)對象都創(chuàng)建對應(yīng)的工廠,每個(gè)對象的創(chuàng)建工廠是相互獨(dú)立的
創(chuàng)建公共工廠AnimalFactory
public interface IAnimalFactory {
IAnimal instance();
}
創(chuàng)建對象工廠實(shí)現(xiàn)
BirdFactory.class
public class BirdFactory implements IAnimalFactory{
@Override
public IAnimal instance() {
return new Bird();
}
}
CatFactory.class
public class CatFactory implements IAnimalFactory{
@Override
public IAnimal instance() {
return new Cat();
}
}
如上可以在對應(yīng)的instance方法中加入相應(yīng)的處理邏輯
測試案例
public class Main {
public static void main(String[] args) {
IAnimalFactory animalFactory = new BirdFactory();
IAnimal animal = animalFactory.instance();
animal.eat();
}
}
輸出結(jié)果
bird eating...
3 抽象工廠
每添加一個(gè)產(chǎn)品,工廠方法模式都要?jiǎng)?chuàng)建一個(gè)工廠,久而久之類會非常之多。
工廠方法模式也不能構(gòu)建有具體行為的產(chǎn)品
抽象工廠的理念是抽象,將工廠進(jìn)行加工,最終生成有具體行為的產(chǎn)品
創(chuàng)建行為
public interface ICreate {}
public interface IDead {}
public interface ILive {}
創(chuàng)建有具體行為的產(chǎn)品
bird
public class BirdCreate implements ICreate{
public BirdCreate(){
System.out.println("bird create...");
}
}
public class BirdDead implements IDead{
public BirdDead(){
System.out.println("bird dead...");
}
}
public class BirdLive implements ILive{
public BirdLive(){
System.out.println("bird live...");
}
}
cat
public class CatCreate implements ICreate{
public CatCreate(){
System.out.println("cat create...");
}
}
public class CatDead implements IDead{
public CatDead(){
System.out.println("cat dead...");
}
}
public class CatLive implements ILive{
public CatLive(){
System.out.println("cat live...");
}
}
創(chuàng)建工廠
public interface IAnimalFactory {
//創(chuàng)建新生動物
ICreate create();
//創(chuàng)建活物
ILive live();
//創(chuàng)建死物
IDead dead();
}
最后實(shí)現(xiàn)具體的產(chǎn)品工廠
BirdFactory
public class BirdFactory implements IAnimalFactory {
@Override
public ICreate create() {
return new BirdCreate();
}
@Override
public ILive live() {
return new BirdLive();
}
@Override
public IDead dead() {
return new BirdDead();
}
}
CatFactory
public class CatFactory implements IAnimalFactory {
@Override
public ICreate create() {
return new CatCreate();
}
@Override
public ILive live() {
return new CatLive();
}
@Override
public IDead dead() {
return new CatDead();
}
}
測試案例
public class Main {
public static void main(String[] args) {
IAnimalFactory animalFactory = new CatFactory();
animalFactory.create();
animalFactory.live();
animalFactory.dead();
}
}
輸出結(jié)果
cat create...
cat live...
cat dead...
抽象工廠模式不符合開閉原則,當(dāng)增加行為時(shí),所有的具體實(shí)現(xiàn)都需要增加相應(yīng)的行為
ps:以上接口可用抽象類代替