工厂模式是一种设计理念,故名思意,通过工厂生产出一种产品出来,分为简单工厂模式、工厂模式、抽象工厂模式
一.简单工厂模式
工厂类拥有一个工厂方法(create),接受了一个参数,通过不同的参数实例化不同的产品类。
优点:通过工厂类可以创建任何产品类,无所不能
缺点:负担重,工厂代码量会越来越大,不符合开闭原则,增加产品,必须修改工厂类
/**
* 动物工厂
* @author zhouzhongyi
*
*/
public class SimpleAnimalFatory {
public static Animal createAnimal(String name){
if("cat".equals(name)){//创建猫
return new Cat();
}else if("dog".equals(name)){//创建狗
return new Dog();
}else{//。。等等其他
return null;
}
}
}
二.工厂模式
工厂方法是针对每一种产品提供一个工厂类,通过不同的工厂实例来创建不同的产品实例
优点:
- 减轻了工厂类负担,把某一类/某一种东西交由一个工厂生产;
- 增加某一类”东西“不需要修改工厂类,添加生产这类”东西“的工厂即可,符合开放-封闭原则
缺点:对于某些可以形成产品族的情况处理比较复杂
/**
*抽象 动物工厂
* @author zhouzhongyi
*
*/
public abstract class AnimalFatory {
工厂方法
public abstract Animal createAnimal();
}
/**
* 猫工厂
* @author zhouzhongyi
*
*/
public class CatFatory extends AnimalFatory {
@Override
public Animal createAnimal() {
// TODO Auto-generated method stub
return new Cat();
}
}
/**
* 狗工厂
* @author zhouzhongyi
*
*/
public class DogFatory extends AnimalFatory {
@Override
public Animal createAnimal() {
// TODO Auto-generated method stub
return new Dog();
}
}
三.抽象工厂模式
抽象工厂是针对某一族产品的概念,前面工厂模式中通过工厂可以创建狗、猫,那能否创建某一类型的狗和猫呢?比如说创建不同颜色的狗和猫,代码如下:
/**
* 动物一族
* @author zhouzhongyi
*
*/
public interface Animal {
public void createAnimal();
}
/**
* 把猫抽象出来
* @author zhouzhongyi
*
*/
public abstract class Cat implements Animal {
public abstract void createAnimal();
}
/**
* 把狗抽象出来
* @author zhouzhongyi
*
*/
public abstract class Dog implements Animal {
public abstract void createAnimal();
}
/**
* 具体颜色的猫
* @author zhouzhongyi
*
*/
public class HeiCat extends Cat {
@Override
public void createAnimal() {
System.out.println("我是黑颜色的猫");
}
}
/**
* 具体颜色的猫
* @author zhouzhongyi
*
*/
public class HongCat extends Cat {
@Override
public void createAnimal() {
System.out.println("我是红颜色的猫");
}
}
/**
* 具体颜色的狗
* @author zhouzhongyi
*
*/
public class HeiDog extends Dog{
@Override
public void createAnimal() {
System.out.println("我是黑狗");
}
}
/**
* 具体颜色的狗
* @author zhouzhongyi
*
*/
public class HongDog extends Dog{
@Override
public void createAnimal() {
System.out.println("我是红狗");
}
}
/**
* 创建动物工厂接口,通过不通颜色工厂去实现具体颜色的猫和狗
* @author zhouzhongyi
*
*/
public interface AnimalFatory {
Animal getCatZu();//获取某种颜色猫对象
Animal getDogZu();//获取某种颜色狗对象
}
/**
* 黑颜色动物工厂类创建黑颜色动物对象
* @author zhouzhongyi
*
*/
public class HeiFatory implements AnimalFatory{
@Override
public Animal getCatZu() {
// TODO Auto-generated method stub
return (Animal) new HeiCat();
}
@Override
public Animal getDogZu() {
// TODO Auto-generated method stub
return new HeiDog();
}
}
/**
* 红颜色工厂类创建红颜色动物对象
* @author zhouzhongyi
*
*/
public class HongFatory implements AnimalFatory{
@Override
public Animal getCatZu() {
// TODO Auto-generated method stub
return new HongCat();
}
@Override
public Animal getDogZu() {
// TODO Auto-generated method stub
return new HongDog();
}
}
public class Test {
public static void main(String[] args) {
AnimalFatory hongFatory = new HongFatory();
//获取红猫
Animal hongcat = hongFatory.getCatZu();
hongcat.createAnimal();
//获取红狗
Animal hongdog = hongFatory.getDogZu();
hongdog.createAnimal();
//如果需在加一种颜色只需要再创建一个颜色工厂实现动物工厂接口即可
}
}
上边的工厂方法模式是一种极端情况的抽象工厂模式(即只生产一种产品的抽象工厂模式),而抽象工厂模式可以看成是工厂方法模式的一种推广