工厂模式
工厂模式(创建型模式):创建对象接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建延伸到子类进行
主要解决接口选择问题,明确计划不同条件下执行创建不同实例
通过子类实现工厂实例,创建过程在其子类执行
优点:提高扩展性,屏蔽产品具体实现,调用者只关心产品接口;
缺点:增加一个产品,会导致系统中类个数增加,造成系统复杂度
使用场景:
1.日志记录:用户选择将日志记录到磁盘/系统事件/远程服务器2.数据库访问:系统采用不同的数据库3.设计连接服务器的框架, 比如针对pop3, imap, http设计接口
注:工厂模式作为类的创建模式, 复杂的对象使用工厂模式, 简单对象使用new, 而非工厂模式
简单工厂:一个工厂类,一个产品抽象类
工厂方法:多个工厂类,一个产品抽象类
抽象工厂:多个工厂类,多个产品抽象类
个人思考:
采用松耦合,多态的方式,使得我想要哪一个功能,就生成相应对象
问题的考虑方向只需放在要实例化哪个类,要增加哪一项功能也可以使用枚举的方式
实现工厂模式: 将每个工厂实例作为枚举对象,通过枚举工厂进行调用
抽象工厂
抽象工厂模式(创建型模式,其他工厂的工厂):
接口只负责创建一个相关的对象的工厂,不需要显式指定类,工厂模式就能按照工厂模式提供对象(多态)
用于解决接口选择问题
优点:当产品族中,多个对象被设计成一起工作,能保证客户端只使用一个产品族中对象
缺点:产品族中扩展产品,需要在抽象类中添加代码, 还需要在具体实现里面添加代码
个人思考:
1. 懂得一点,使用设计模式, 先搞定UML2. 建立多个工厂, 然后建立一个总的工厂,通过总的工厂调用下属工厂3. 主要还是多态的性质运用, 程序中还有很多瑕疵4. 主要还是接口的选择, 以及状态的变化
下面给出例子说明抽象工厂与工厂模式:
package com.AbstractFactory;
/*** 懂得一点,使用设计模式, 先搞定UML* 建立多个工厂, 然后建立一个总的工厂,通过总的工厂调用下属,* 主要还是多态的性质运用, 程序中还有很多瑕疵* 主要还是接口的选择, 以及状态的变化* @author regotto**/
public class AbstractFactoryDemo1 {public static void main(String[] args) {// 获得图像工厂AbstractFactoryShapeColor shapefactory=FactoryProducer1.getFactory("Shape");// 根据目标图像绘制对应的图案shapefactory.getShape("Rectangle").draw();// 获得颜色工厂AbstractFactoryShapeColor colorfactory=FactoryProducer1.getFactory("Color");//根据需要的颜色给对应的图像做颜色填充colorfactory.getColor("Red").fill();;}}//使用工厂
class FactoryProducer1{public static AbstractFactoryShapeColor getFactory(String FactoryType) {if(FactoryType==null) return null;else if(FactoryType.equals("Shape"))return new ShapeFactory();else if(FactoryType.equals("Color"))return new ColorFactory();else return null;}
}//抽象工厂
abstract class AbstractFactoryShapeColor{public abstract Shape getShape(String shapeType);public abstract Color getColor(String colorType);
}//Shape工厂
class ShapeFactory extends AbstractFactoryShapeColor{public Shape getShape(String shapeType) {if(shapeType==null)return null;if(shapeType.equals("Rectangle"))return new Rectangle();else if(shapeType.equals("Square"))return new Square();else if(shapeType.equals("Circle"))return new Circle();else return null;}@Overridepublic Color getColor(String colorType) {// TODO Auto-generated method stubreturn null;}
}//Color工厂
class ColorFactory extends AbstractFactoryShapeColor{public Shape getShape(String shapeType) {if(shapeType==null)return null;if(shapeType.equals("Rectangle"))return new Rectangle();else if(shapeType.equals("Square"))return new Square();else if(shapeType.equals("Circle"))return new Circle();else return null;}@Overridepublic Color getColor(String colorType) {if(colorType==null)return null;if(colorType.equals("Red"))return new Red();else if(colorType.equals("Bule"))return new Blue();else if(colorType.equals("Green"))return new Green();else return null;}
}//Shape属性
interface Shape{void draw();
}
class Rectangle implements Shape{public void draw() {System.out.println("Rectangle"); }
}
class Square implements Shape{public void draw() {System.out.println("Square"); }
}
class Circle implements Shape{public void draw() {System.out.println("Circle"); }
}//Color属性
interface Color{void fill();
}
class Red implements Color{public void fill() {System.out.println("Red");}
}
class Blue implements Color{public void fill() {System.out.println("Blue");}
}
class Green implements Color{public void fill() {System.out.println("Green");}
}
代码中分别建立了两个工厂—color以及shape, 实现顶级抽象父类AbstractFactoryShapeColor, 最后新建一个实体工厂分别获得color以及shape两个工厂, 通过AbstractFactoryShapeColor的引用分别调用draw和fill方法对图像的绘制和颜色的填充
体现了多个工厂, 多个抽象产品, 获得抽象产品的方式延伸到子类中进行