工厂模式

一、背景

      如果现在要实例化一个类 Shape,最直接了当的方法就是 Shape s = new Shape();但是如果Shape有众多子类(比如 Squre Circle ..等等)需要实例化的话 ,我们就需要 一个一个去new (Shape c = new Circle(), Shape sq = new Squre()..)这么做的话,如果某个子类的构造函数变了,比如说增加了传参,那么我们就要满系统的去找 new 这个子类的地方,然后改掉。好麻烦啊~,所以前辈们便总结出了工厂模式,来解决类似的麻烦。

二、工厂模式的概念、及能解决的问题

      我理解的工厂模式,即把自己想要的对象 “告诉 ”工厂类,然后工厂创建(对象)并返回给你。工厂模式统一管理了对象的创建。给系统带来了可扩展性,减少了修改,即遵循了开闭原则。

三、代码实例

      比如现在有一个Shape接口 提供画图的方法 draw, 它有一个圆一个方的子类 分别为 Squre、Circle 。

1.静态方法工厂模式:

interface Shape {//图形接口
	public void draw();
}
//工厂类
class Shape{
	public static Object CreateObject(String name) {
		if("Squre".equals(name)) {
                     return new Squre();
                }
                if("Circle".equals(name)) {
                   return new Circle();
                }
	}
}
//圆类
class Circle implements Shape {

	@Override
	public void draw() {
		System.out.println("draw circle!");
	}

}
//方类
class Squre implements Shape {

	@Override
	public void draw() {
		System.out.println("draw squre!");
	}
}

如此 便可通过 工厂类来获得对象的实例

public static void main(String agrs[]) {
		Shape sq = FactoryShape.CreateObject("Squre");
		sq.draw();
		Shape c= FactoryShape.CreateObject("Circle");
		c.draw();
	}

2.抽象工厂模式:

      上面的工厂是专门用来生成图形类实例的工厂,那么现在想要其他类实例的工厂,怎么办呢?那就来一个创建工厂的工厂,想要什么工厂就创建什么工厂。抽象出一个工厂,所有子工厂都继承该抽象工厂。比如现在加一个生产水果的工厂FruitsFactory。

如下是将被工厂创建实例的 类

interface Shape {
	public void draw();
}

interface Fruits {
	public void product();
}

class Squre implements Shape {

	@Override
	public void draw() {
		System.out.println("draw Squre");
	}

}

class Circle implements Shape {

	@Override
	public void draw() {
		System.out.println("draw Circle");
	}

}

class Apple implements Fruits {
	@Override
	public void product() {
		System.out.println("product Apple");
	}
}

class Orange implements Fruits {

	@Override
	public void product() {
		System.out.println("product Orange");
	}

}

如下是抽象工厂类及各个子工厂类

abstract class AbstractFactory {// 抽象工厂类 所有工厂的父类
	public abstract Shape getShape(String name);

	public abstract Fruits getFruit(String name);
}
及各个子工厂类
class ShapeFactory extends AbstractFactory {

	@Override
	public Shape getShape(String name) {
		if ("Squre".equals(name)) {
			return new Squre();
		}
		if ("Circle".equals(name)) {
			return new Circle();
		}
		return null;
	}

	@Override
	public Fruits getFruit(String name) {

		return null;
	}

}

class FruitsFactory extends AbstractFactory {

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

	@Override
	public Fruits getFruit(String name) {
		if ("Apple".equals(name)) {
			return new Apple();
		}
		if ("Orange".equals(name)) {
			return new Orange();
		}
		return null;
	}
}

生产工厂的工厂类

class FactoryProduct {
	public AbstractFactory getAbstractFactory(String facName) {
		if ("ShapeFactory".equals(facName)) {
			return new ShapeFactory();
		}
		if ("FruitsFactory".equals(facName)) {
			return new FruitsFactory();
		}
		return null;
	}
}

main 方法

public class TestFac {
	public static void main(String agrs[]) {
		// 现在要获取一个Apple对象 并执行生产Apple的方法
		new FactoryProduct().getAbstractFactory("FruitsFactory")
				.getFruit("Apple").product();
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值