Java设计模式(一)工厂模式:简单工厂模式与工厂方法模式

       在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动。

    使用工厂模式来创建对象,可以不必关心构造对象的具体过长和细节。

一、简单工厂模式

package pattern;
//simple Factory
abstract class Car{
	void describe(){};
}

class Bigcar extends Car{
	public void describe(){System.out.println("bigcar");}
}

class Middlecar extends Car{
	public void describe(){System.out.println("Middlecar");}
}

class Smallcar extends Car{
	public void describe(){System.out.println("Smallcar");}
}

class Factory{
	public Car createCar(String type){
		switch(type){
		case "Bigcar":return new Bigcar();
		case "Middlecar":return new Middlecar();
		case "Smallcar":return new Smallcar();
		default:return null;
		}
	}
}

public class Client {
	public static void main(String[] args){
		Factory f =new Factory();
		Car bigcar = f.createCar("Bigcar");
		bigcar.describe();
		Car middlecar = f.createCar("Middlecar");
		middlecar.describe();
		Car smallcar = f.createCar("Smallcar");
		smallcar.describe();
	}

}
//输出结果:
bigcar
Middlecar
Smallcar

我们可以看到在这个简单工厂模式中有四种角色

  • 抽象产品类:具体产品类的父类或者接口
  • 具体产品类:由工厂所创建的具体对象
  • 工厂类:模式的核心,含有一定的判断语句
  • 客户类:创建工厂类,进而创建具体产品类的实例

二、工厂方法模式

package pattern;
//simple Factory
abstract class Car{
	void describe(){};
}

class Bigcar extends Car{
	public void describe(){System.out.println("bigcar");}
}

class Middlecar extends Car{
	public void describe(){System.out.println("Middlecar");}
}

class Smallcar extends Car{
	public void describe(){System.out.println("Smallcar");}
}

abstract class Factory{
	public Car createCar(){return null;}
}

class bigFactory extends Factory{
	public Car createCar(){
		return new Bigcar();
	}
}

class middleFactory extends Factory{
	public Car createCar(){
		return new Middlecar();
	}
}
class smallFactory extends Factory{
	public Car createCar(){
		return new Smallcar();
	}
}

public class Client {
	public static void main(String[] args){
		Factory f1 =new bigFactory();
		Factory f2 =new middleFactory();
		Factory f3 =new smallFactory();
		Car bigcar = f1.createCar();
		bigcar.describe();
		Car middlecar = f2.createCar();
		middlecar.describe();
		Car smallcar = f3.createCar();
		smallcar.describe();
	}

}

我们可以看到在这个简单工厂模式中有五种角色

  • 抽象产品类:具体产品类的父类或者接口
  • 具体产品类:由工厂所创建的具体对象
  • 抽象工厂类:具体工厂类的父类或者接口
  • 具体工厂类:有多个具体的工厂类,每个工厂类创建不同的实例,而不是相当于简单工厂模式下的逻辑判断来实现。
  • 客户类:创建工厂类,进而创建具体产品类的实例
可以看出工厂方法的加入,使得对象的数量成倍增长。当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。因为如果不能避免这种情况,可以考虑使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实现。


猜你喜欢

转载自blog.csdn.net/duan_2018/article/details/79880643