1. 简单工厂模式
通过一个工厂类来创建对象,而无需直接调用对象的构造函数。
将对象的创建过程封装在工厂类中,客户端只需要通过工厂类来获取所需的对象。
1.1 UML类图
1.2 代码实现
手机产品类
interface Phone{
}
class MPhone implements Phone{
public MPhone(){
System.out.println("制造小米手机");
}
}
class IPhone implements Phone{
public IPhone(){
System.out.println("制造苹果手机");
}
}
工厂类
class PhoneFactory{
public Phone createPhone(String phoneType){
if ("小米手机".equals(phoneType)){
return new MPhone();
}else if ("苹果手机".equals(phoneType)){
return new IPhone();
}else {
return null;
}
}
}
客户端
public class Client {
public static void main(String[] args) {
String phoneType1 = "小米手机"; //1客户的需求,他想要小米手机
String phoneType2 = "苹果手机"; //2客户的需求,他想要苹果手机
PhoneFactory phoneFactory = new PhoneFactory();//创建生产工厂对象,此时该工厂可以生产两种类型的手机(本质上可以生产很多类型的手机)
//通过工厂进行生产,不让用户介入
phoneFactory.createPhone(phoneType1);
phoneFactory.createPhone(phoneType2);
}
}
所有代码
//客户端
public class Client {
public static void main(String[] args) {
String phoneType1 = "小米手机"; //1客户的需求,他想要小米手机
String phoneType2 = "苹果手机"; //2客户的需求,他想要苹果手机
PhoneFactory phoneFactory = new PhoneFactory();//创建生产工厂对象,此时该工厂可以生产两种类型的手机(本质上可以生产很多类型的手机)
//通过工厂进行生产,不让用户介入
phoneFactory.createPhone(phoneType1);
phoneFactory.createPhone(phoneType2);
}
}
//手机产品
interface Phone{
}
class MPhone implements Phone{
public MPhone(){
System.out.println("制造小米手机");
}
}
class IPhone implements Phone{
public IPhone(){
System.out.println("制造苹果手机");
}
}
//手机工厂
class PhoneFactory{
public Phone createPhone(String phoneType){
if ("小米手机".equals(phoneType)){
return new MPhone();
}else if ("苹果手机".equals(phoneType)){
return new IPhone();
}else {
return null;
}
}
}
1.3 理解
简单工厂模式下,工厂只能创建实现了 Phone 接口的类的对象,进行扩展功能的时候需要添加新的实现类,并且需要修改工厂的代码(即createPhone() 方法),违反了设计模式的开闭原则(OCP)
2. 工厂方法模式
工厂方法模式将工厂抽象化,并定义一个创建对象的接口。每增加新产品,只需增加该产品以及对应的具体实现工厂类,由具体工厂类决定要实例化的产品是哪个,将对象的创建与实例化延迟到子类,这样工厂的设计就符合“开闭原则”了,扩展时不必去修改原来的代码。在使用时,用于只需知道产品对应的具体工厂,关注具体的创建过程,甚至不需要知道具体产品类的类名,当我们选择哪个具体工厂时,就已经决定了实际创建的产品是哪个了(CV)
2.1 UML类图
2.2 代码实现
手机产品类
interface Phone{
}
class MPhone implements Phone{
public MPhone(){
System.out.println("制造小米手机");
}
}
class IPhone implements Phone{
public IPhone(){
System.out.println("制造苹果手机");
}
}
工厂类
interface PhoneFactory{
Phone createPhone();
}
class MPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {//此处类型写 MPhone,更能体验单一职责原则
return new MPhone();
}
}
class IPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {//此处类型写 IPhone,更能体验单一职责原则
return new IPhone();
}
}
客户端
public class Client {
public static void main(String[] args) {
MPhoneFactory mPhoneFactory = new MPhoneFactory();//创造该工厂对象的时候,注定该工厂只能生产 小米手机
mPhoneFactory.createPhone();//生产小米手机
IPhoneFactory iPhoneFactory = new IPhoneFactory();//创建该工厂对象的时候,注定该工厂只能生产 苹果手机
iPhoneFactory.createPhone();//生产苹果手机
}
}
所有代码
//客户端
public class Client {
public static void main(String[] args) {
MPhoneFactory mPhoneFactory = new MPhoneFactory();//创造该工厂对象的时候,注定该工厂只能生产 小米手机
mPhoneFactory.createPhone();//生产小米手机
IPhoneFactory iPhoneFactory = new IPhoneFactory();//创建该工厂对象的时候,注定该工厂只能生产 苹果手机
iPhoneFactory.createPhone();//生产苹果手机
}
}
//手机产品类
interface Phone{
}
class MPhone implements Phone{
public MPhone(){
System.out.println("制造小米手机");
}
}
class IPhone implements Phone{
public IPhone(){
System.out.println("制造苹果手机");
}
}
//工厂类
interface PhoneFactory{
Phone createPhone();
}
class MPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {//此处类型写 MPhone,更能体验单一职责原则
return new MPhone();
}
}
class IPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {//此处类型写 IPhone,更能体验单一职责原则
return new IPhone();
}
}
2.3 理解
工厂方法模式下,是由小工厂(工厂接口的实现类)在工厂运行标准(接口工厂)的约束下完成对手机的生产(创建对象)。在客户端,客户选择某个工厂(创建该工厂对象)的时候,就间接选择了某个手机。
3. 抽象工厂模式
在工厂方法模式中,我们使用一个工厂创建一个产品,一个具体工厂对应一个具体产品,但有时候我们需要一个工厂能够提供一系列产品对象,而不是单一的对象,这个时候我们就需要使用抽象工厂模式。
注:一系列产品,在现实生活中,购买小米手机后,需要原装充电器,原装耳机,配套手表等等一系列物品,这些产品都是由同一个工厂生产出来的。即工厂对应品牌。
一系列产品对象就是该工厂通过不同方法创建出来的对象。
3.1 UML类图
3.2 代码
产品类
interface Phone{
}
class MPhone implements Phone{
public MPhone(){
System.out.println("制造小米手机");
}
}
class IPhone implements Phone{
public IPhone(){
System.out.println("制造苹果手机");
}
}
interface Charger{
}
class MCharger implements Charger{
public MCharger(){
System.out.println("制作小米充电器");
}
}
class ICharger implements Charger{
public ICharger(){
System.out.println("制作苹果充电器");
}
}
工厂类
interface Factory{
Phone createPhone();
Charger createCharger();
}
//该工厂就代表 小米品牌
class MFactory implements Factory{
@Override
public Phone createPhone() {//此处类型写 MPhone,更能体验单一职责原则
return new MPhone();
}
@Override
public Charger createCharger() {//此处类型写 MCharger,更能体验单一职责原则
return new MCharger();
}
}
//该工厂就代表 苹果品牌
class IFactory implements Factory{
@Override
public Phone createPhone() {//此处类型写 IPhone,更能体验单一职责原则
return new IPhone();
}
@Override
public Charger createCharger() {//此处类型写 ICharger,更能体验单一职责原则
return new ICharger();
}
}
客户端
public class Client {
public static void main(String[] args) {
MFactory mPhoneFactory = new MFactory();//创造该工厂对象的时候,注定该工厂只能生产 小米品牌商品
mPhoneFactory.createPhone();//生产小米手机
mPhoneFactory.createCharger();//生产小米充电器
IFactory iPhoneFactory = new IFactory();//创建该工厂对象的时候,注定该工厂只能生产 苹果品牌商品
iPhoneFactory.createPhone();//生产苹果手机
iPhoneFactory.createCharger();//生产苹果充电器
}
}
所有代码
//客户端
public class Client {
public static void main(String[] args) {
MFactory mPhoneFactory = new MFactory();//创造该工厂对象的时候,注定该工厂只能生产 小米品牌商品
mPhoneFactory.createPhone();//生产小米手机
mPhoneFactory.createCharger();//生产小米充电器
IFactory iPhoneFactory = new IFactory();//创建该工厂对象的时候,注定该工厂只能生产 苹果品牌商品
iPhoneFactory.createPhone();//生产苹果手机
iPhoneFactory.createCharger();//生产苹果充电器
}
}
//手机产品类
interface Phone{
}
class MPhone implements Phone{
public MPhone(){
System.out.println("制造小米手机");
}
}
class IPhone implements Phone{
public IPhone(){
System.out.println("制造苹果手机");
}
}
//充电器产品类
interface Charger{
}
class MCharger implements Charger{
public MCharger(){
System.out.println("制作小米充电器");
}
}
class ICharger implements Charger{
public ICharger(){
System.out.println("制作苹果充电器");
}
}
//工厂
interface Factory{
Phone createPhone();
Charger createCharger();
}
//该工厂就代表 小米品牌
class MFactory implements Factory{
@Override
public Phone createPhone() {//此处类型写 MPhone,更能体验单一职责原则
return new MPhone();
}
@Override
public Charger createCharger() {//此处类型写 MCharger,更能体验单一职责原则
return new MCharger();
}
}
//该工厂就代表 苹果品牌
class IFactory implements Factory{
@Override
public Phone createPhone() {//此处类型写 IPhone,更能体验单一职责原则
return new IPhone();
}
@Override
public Charger createCharger() {//此处类型写 ICharger,更能体验单一职责原则
return new ICharger();
}
}
3.3 理解
抽象工厂模式下,所有品牌工厂(工厂实现类)在工厂标准的约束(接口)下,生产该品牌下的一系列产品(通过工厂方法创建对象)。
4. 总结
对比工厂方法和抽象工厂,它两个本质差不多,区别在于工厂能创建的不同产品个数。工厂方法只能生产一种商品,而抽象工厂则是对其进行扩展,能够生产不同种类的产品。
在现实生活中抽象工厂模式下的子工厂就相当于 品牌,产品就相当于该品牌下的一系列商品(苹果工厂不会生产小米手机)。
以上所有工厂均可结合单例模式使用,或者直接将生产对象的方法使用 static 修饰。