Java中23种设计模式-普通工厂和抽象工厂详解

入门介绍

  创建型模式,共五种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。

一、定义
  定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延伸到其子类。
  简单的说,就是定义一个工厂,由工厂的生产方法来生产具体的产品类,用户只需要调用工厂的生产方法来获取具体的产品,而不需要关心生产的过程。

二、优点
  1.拥有良好的封装性。调用者需要一个具体产品,只需要向工厂获取,而不用知道创建对象的艰辛过程,降低模块间的耦合。
  2.易于扩展。增加产品时,只需要适当修改具体的工厂类或者扩展一个工厂,甚至不用修改。
  3.屏蔽产品类,解除耦合。产品类的实现如何变化,调用者都不需要关心,只需要关心产品的接口即可。
三、缺点
  1.我们在实例化对象的时候通常用的是 New关键字,但是有了工厂,我们在声明对象的时候就可以用工厂了,用new导致代码不够灵活,用工厂来实例化对象很灵活。
  2.在使用简单对象时,直接new对象就可以了,使用工厂方法反而会增加系统的复杂度

实例讲解

1.普通工厂方法

1.创建颜色接口,通过接口利用多态实例化对象Color

//创建颜色接口,面向接口编程
public interface Color {
	void color();
}

2.创建实例化对象,red,blue,yellow

public class Red implements Color{

	@Override
	public void color() {
		System.out.println("这是红色");	
	}

}

public class Blue implements Color{
	
	@Override
	public void color() {
		System.out.println("这是蓝色");	
	}
	
}

public class Yellow implements Color{

	@Override
	public void color() {
		System.out.println("这是黄色");		
	}

}

3.创建普通工厂,用于生产各种颜色

	//普通工厂实例化对象,颜色工厂可以生成各种颜色
public class ColorFactory {
	public Color getColor(String color) {
	   //根据条件实例化对象
		if(color==null) {
			System.out.println("请输入颜色,选择实例化的对象");
			return null;
		} else if (color.equalsIgnoreCase("red")) {
			return new Red();
		} else if (color.equalsIgnoreCase("blue")) {
			return new Blue();
		} else if (color.equalsIgnoreCase("yellow")) {
			return new Yellow();
		} else {
			System.out.println("请输入正确的颜色,才能实例化!!!");
			return null;
		}
	}
}

4.测试类,测试是否正常实例化对象

//创建测试类,验证是否实例化了对象
public class MainTest {
	public static void main(String[] args) {
		//1.创建工厂对象,根据工厂对象,实例化所需要的对象
		ColorFactory colorFactory=new ColorFactory();
	    try {
			/*2.根据条件选择需要实例化的对象,例如实例化red对象。
			为什么实例化red对象,可以用color这个接口类接受,并且调用实现类的方法,
			虽然接口类,不能new对象,但是通过多态的方式,创建一个Color类型的变量,而这个对象实际是red*/
			Color color = colorFactory.getColor("red");
			//3.实例化的对象,调用方法
			color.color();
		} catch (Exception e) {
			e.printStackTrace();
		}	
	}
}

4.运行结果
在这里插入图片描述

2.抽象工厂方法

1.创建颜色接口和图形接口,通过接口利用多态实例化对象Color,Shape对象

//创建颜色接口,面向接口编程
public interface Color {
	void color();
}
//创建图形接口,面向接口编程
public interface Shape {
	void shape();
}

2.创建实体类,颜色实体类和图形实体类

public class Red implements Color{
	
		@Override
		public void color() {
			System.out.println("这是红色");	
		}
	
	}
	
	public class Blue implements Color{
		
		@Override
		public void color() {
			System.out.println("这是蓝色");	
		}
		
	}
	
	public class Yellow implements Color{
	
		@Override
		public void color() {
			System.out.println("这是黄色");		
		}
	
	}
	
	public class Square implements Shape {

	@Override
	public void shape() {
		System.out.println("正方形");
	}

}
    public class Triangle implements Shape {

	@Override
	public void shape() {
		System.out.println("三角形的方法");
	}

}

3.创建抽象工厂

//抽象工厂方法,就创建一个抽象类工厂
public abstract class AbstractFactory {
	//定义抽象方法,去实例化对象
	public abstract Color getColor(String color);
	public abstract Shape getShape(String shape);
}

4.创建颜色工厂和图形工厂

//普通工厂实例化对象
public class ColorFactory extends AbstractFactory{
	@Override
	public Color getColor(String color) {
	   //根据条件实例化对象
		if(color==null) {
			System.out.println("请输入颜色,选择实例化的对象");
			return null;
		} else if (color.equalsIgnoreCase("red")) {
			return new Red();
		} else if (color.equalsIgnoreCase("blue")) {
			return new Blue();
		} else if (color.equalsIgnoreCase("yellow")) {
			return new Yellow();
		} else {
			System.out.println("请输入正确的颜色,才能实例化!!!");
			return null;
		}
	}

	@Override
	public Shape getShape(String shape) {
		
		return null;
	}
}

//创建图形工厂,生产各种形状
public class ShapeFactory extends AbstractFactory{
	@Override
	 public Shape getShape(String shape) {
		//根据条件实例化对象
		if(shape==null) {
			System.out.println("请输入图形,选择实例化的对象");
			return null;
		} else if (shape.equalsIgnoreCase("triangle")) {
			return new Triangle();
		} else if (shape.equalsIgnoreCase("square")) {
			return new Square();
		} else {
			System.out.println("请输入正确的图形,才能实例化!!!");
			return null;
		}
	 }

	@Override
	public Color getColor(String color) {
		
		return null;
	}

	
}

5.创建工厂生产者,决定实例化那个工厂

//创建工厂生产者,根据条件实例化工厂
public class FactroyProducer {
	public AbstractFactory getFactory(String factory) {
		if (factory==null) {
			System.out.println("请输入要实例化的工厂");
			return null;
		} else if (factory.equalsIgnoreCase("shapeFactory")) {
			return new ShapeFactory();
		} else if (factory.equalsIgnoreCase("colorFactory")) {
			return new ColorFactory();
		} else {
			System.out.println("请输入正确的工厂");
			return null;
		}
		
	}
}

6.测试工厂和实例对象是否正常

public class MainTest {
	public static void main(String[] args) {
		// 1.创建工厂生产者对象
		FactroyProducer FactroyProducer=new FactroyProducer();
		try {
			// 2.根据条件实例化工厂,比如实例化图形工厂
			AbstractFactory abstractFactory=FactroyProducer.getFactory("shapeFactory");
			// 3.根据工厂实例化对象,比如实例化正方形
			Shape shape=abstractFactory.getShape("square");
			// 4.调用正方形的方法
			shape.shape();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

7.运行结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值