工厂方法模式和抽象工厂模式均为工厂模式。
工厂模式的出现就相当于我们作为客户,需要一辆汽车,在工厂模式出现之前,我们得知道怎么造一辆汽车。有了工厂之后,工厂负责造汽车,我们需要汽车的时候就找工厂要就行了。
适用于:我们需要一个系列的东西,他们具有相同的特性,但是我们不需要自己去创造,建一个工厂模型,让它给我们创造,我们只要调用它买就行。
分析角色:
需要角色:客户、工厂、产品
简单工厂模式:
(只有一个工厂,这个工厂负责所有的产品生产,这样的实现方法,如果想新增一种产品的时候得改一下工厂类的代码)
产品抽象类
产品实现类
工厂类(上帝类)
具体代码实现:
public abstract class Car {
public Car(){
}
}
public class BW extends Car{
public BW(){
System.out.println("宝马车");
}
}
public class DZ extends Car{
public DZ(){
System.out.println("大众车");
}
}
/**
* 简易工厂类(一个工厂就可以生产很多汽车,俗称上帝类)
* @author wangyj
*
*/
public class SimpleFactory {
public Car makeCar(String type){
if("BW".equals(type)){
return new BW();
}else if("DZ".equals(type)){
return new DZ();
}else{
return null;
}
}
}
public class Customer {
public static void main(String[] args) {
SimpleFactory factory = new SimpleFactory();
Car car = factory.makeCar("BW");//客户调用工厂,得到了一辆宝马汽车
}
}
工厂方法模式:
(多个工厂,每个工厂负责生产不同的产品,如果热插拔实现,每增加一种产品只需要加一个实现类。但是当产品种类非常多时,会出现大量的与之对应的工厂对象,这不是我们所希望的。因为如果不能避免这种情 况,可以考虑使用简单工厂模式与工厂方法模式相结合的方式来减少工厂类:即对于产品树上类似的种类(一般是树的叶子中互为兄弟的)使用简单工厂模式来实 现。)
产品抽象类
产品实现类
工厂接口
工厂实现类
具体代码实现:
public abstract class Car {
public Car(){
}
}
public class BW extends Car{
public BW(){
System.out.println("宝马车");
}
}
public class DZ extends Car{
public DZ(){
System.out.println("大众车");
}
}
public interface FactoryMethod {
public Car makeCar();
}
public class BWFactory implements FactoryMethod{
public Car makeCar() {
return new BW();
}
}
public class DZFactory implements FactoryMethod{
public Car makeCar() {
return new DZ();
}
}
public class Customer {
public static void main(String[] args) {
FactoryMethod factory = new BWFactory();
Car car = factory.makeCar();//客户得到一辆宝马车
}
}
抽象工厂模式:
(每个工厂不仅要生产主产品,还要生产配套产品。即一辆汽车要对应生产汽车及汽车上的空调)
产品抽象类
产品实现类
工厂接口(定义多个产品生产方法)
工厂实现类
具体代码实现:
public abstract class Car {
public void drive(){
}
}
public class DZ extends Car{
public void drive(){
System.out.println("大众车");
}
}
public class BW extends Car{
public void drive(){
System.out.println("宝马车");
}
}
public class AirCondition {
public void wind(){
}
}
public class CarAirCondition extends AirCondition{
public void wind(){
System.out.println("车的空调");
}
}
public interface AbstractFactory {
public Car makeCar();
public AirCondition makeAirCondition();
}
public class BWFactory implements AbstractFactory{
public Car makeCar() {
return new BW();
}
public CarAirCondition makeAirCondition() {
return new CarAirCondition();
}
}
public class DZFactory implements AbstractFactory{
public Car makeCar() {
return new DZ();
}
public CarAirCondition makeAirCondition(){
return new CarAirCondition();
}
}
public class Customer {
public static void main(String[] args) {
AbstractFactory facotry = new BWFactory();
Car car = facotry.makeCar();
car.drive();
AirCondition airCondition = facotry.makeAirCondition();
airCondition.wind();
}
}