工厂设计模式

工厂设计模式

简单工厂设计模式

  1. 什么是简单工厂设计模式

简单工厂模式属于类的创建型模式,又叫静态工厂方法模式。通过专门定义一个类来创建其他类的实例,被创建的实例通常都具有共同的父类。

  1. 模式中包含的角色及其职责

工厂(creator)
简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类课可以被外界直接调用,创建所需的产品对象。
抽象(product)
简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口。
具体产品(Concrete product)
简单工厂模式所处创建的具体实例对象。

  1. 具体实现:
    定义一个操作接口
public interface Fruit {
	public void get();
}

定义具体的操作类

public class Apple implements Fruit {

	public void get(){
		System.out.println("收集苹果");
	}

}
public class Banna implements Fruit {

	@Override
	public void get() {
		System.out.println("收集香蕉");
	}

}

定义简单工厂类

public class Factory {
	public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
			Class fruit=Class.forName(type);
			return (Fruit) fruit.newInstance();
	}
}

客户端调用

public class Main {
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		Fruit apple = Factory.getFruit("easyFactory.Apple");
		Fruit banna = Factory.getFruit("easyFactory.Banna");
		apple.get();
		banna.get();
	}
}

结果

收集苹果
收集香蕉
  1. 优缺点

在该模式中,工厂类是关键所在,包含着比要的判断逻辑,能根据外界给定的信息,决定应该创建哪个具体类对象,。用户在使用时,可以根据工厂类去创建所需的实例,无需关心对象是如何创建以及组织的。有利于整个软件体系结构的优化。
但是缺点也非常明显,由于工厂类集中了所有实例的创建逻辑,当具体产品类需要进行修改时,也会要求工厂类进行修改,就会导致工厂类臃肿耦合性高,扩展性不好。而且增加、删除某个子类对象的创建都需要打开简单工厂类来进行修改代码也违反了开-闭原则。

工厂方法模式

工厂方法模式是对简单工厂模式进一步的解耦。

  1. 什么是工厂方法模式

又被成为多态工厂模式,定义了一个创建产品对象的工厂接口,将实际创建工作推迟到子类中,核心工厂类不再负责产品的创建,这样核心类成为了一个抽象工厂的角色,仅负责具体工厂子类必须实现的接口,从而进行了解耦。

  1. 模式中的角色和职责
  • 抽象工厂(Creator)角色
    工厂方法模式的核心,任何工厂类都必须实现这个接口
  • 具体工厂(ConConcrete Creator)角色
    具体工厂是抽象工厂的一个实现,负责实例化产品对象
  • 抽象(Produc)角色
    工厂方法模式所创建所有的对象的父类,负责描述所有实例所共有的公共接口
  • 具体产品(Concrete Product)角色
    工厂方法模式所创建的具体实例对象
  1. 具体实现
  • 首先定义一个工厂接口
public interface Factory {
	public Fruit get();
}
  • 具体的工厂类
public class AppleFactory implements Factory{

	public Fruit get(){
		return new Apple();
	}

}
public class BannaFactory implements Factory {
	public Fruit get(){
		return new Banna();
	}
}
  • 具体的操作类和简单工厂模式一样(不赘述)
  • 客户端调用
public class Main {
	public static void main(String[] args) {
		Fruit apple=new AppleFactory().get();
		Fruit banna=new BannaFactory().get();
		apple.get();
		banna.get();
	}
}
  1. 比较

首先,工厂方法与简单工厂模式在结构上的不同不是很明显。当系统需要添加一个具体的对象的时,原有的工厂对象不需要做任何修改,只需要修改客户端,很好地符合了"开放-闭合"原则,这也是工厂方法模式对简单工厂模式解耦的一个体现。
但工厂方法模式的缺点是每增加一个产品类,就需要增加一个对应的工厂类,增加了额外的开发量。

抽象工厂模式

  1. 什么是抽象工厂模式

抽象工厂模式是所有形态的工厂模式中最为抽象和最其一般性的。抽象工厂模式可以向客户端
提供一个接口,使得客户端在不必指定产品的具体类型的情况下,能够创建多个产品族的产品对
象。

  • 产品族和产品等级结构
    在这里插入图片描述

简单来说,产品等级就好比例子中的苹果和香蕉,产品族就是北方苹果和南方苹果。

  1. 模式中包含的角色及角色
  • 抽象工厂(Creator)角色
    抽象工厂模式的核心,包含对多个产品结构的声明,任何工厂类都必须实现这个接口。
  • 具体工厂( Concrete Creator)角色
    具体工厂类是抽象工厂的一个实现,负责实例化某个产品族中的产品对象。
  • 抽象(Product)角色
    抽象模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
  • 具体产品(Concrete Product)角色
    抽象模式所创建的具体实例对象
    总结:抽象工厂中方法对应产品结构,具体工厂对应产品族。
  1. 具体实现
  • 首先定义抽象类
public abstract class Apple implements Fruit {
	public abstract void get();
}
public abstract class Banna implements Fruit {
	public abstract void get(); 
}
  • 实现类
public class NorthApple extends Apple {

	public void get() {
		System.out.println("采集北方苹果");
	}
	
}
public class NorthBanna extends Banna {

	public void get() {
		System.out.println("采集北方香蕉");	
	}

}
public class SouthApple extends Apple {

	public void get() {
		System.out.println("采集南方苹果");
	}
	
}
public class SouthBanna extends Banna {

	public void get() {
		System.out.println("采集南方香蕉");	
	}
}
  • 定义工厂接口
public interface Factory {
	public Fruit getApple();
	
	public Fruit getBanna();
}
  • 定义具体的工厂类
public class NorthFruitFactory implements Factory{

	public Fruit getApple() {
		return new NorthApple();
	}

	public Fruit getBanna() {
		return new NorthBanna();
	}
}
public class SouthFruitFactory implements Factory{

	public Fruit getApple() {
		return new SouthApple();
	}

	public Fruit getBanna() {
		return new SouthBanna();
	}
}
  • 客户端调用
public class Main {
	public static void main(String[] args) {
		Fruit northApple=new NorthFruitFactory().getApple();
		Fruit northBanna=new NorthFruitFactory().getBanna();
		northApple.get();
		northBanna.get();
		
		Fruit southApple=new SouthFruitFactory().getApple();
		Fruit southBanna=new SouthFruitFactory().getBanna();
		southApple.get();
		southBanna.get();
	}
}
  • 结果
采集北方苹果
采集北方香蕉
采集南方苹果
采集南方香蕉
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值