一、背景
如果现在要实例化一个类 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();
}
}