入门介绍
创建型模式,共五种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
一、定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延伸到其子类。
简单的说,就是定义一个工厂,由工厂的生产方法来生产具体的产品类,用户只需要调用工厂的生产方法来获取具体的产品,而不需要关心生产的过程。
二、优点
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.运行结果