1.工厂模式
核心思想就是根据需要来生产相应的对象。
最简单的工厂就像这样
public class MyFactory {
public static Product product(int i){
switch (i){
case 1:return new Product(xxx);
case 2:return new Product(yyy);
case 3:return new Product(zzz);
}
}
}
对于调用者而言,不需要知道其内部实现,只需要关注怎么获取就行。
2、抽象工厂
抽象工厂面对的是一种比较复杂的场景,比如一个对象,我们可以抽象出他的各种特征。比如车,有车的大小、形状、颜色等。然后根据抽象出来的特征,每个特征分别对应一个工厂,生产一个产品的时候就把他们组装在一起。(就好比生产一个手机需要各种配件,各种配件对应各种厂家)
以下代码参考自菜鸟教程
http://www.runoob.com/design-pattern/abstract-factory-pattern.html
比如我们要生产一个物体,它有形状和颜色两个特征
- 第一个特征-形状
public interface Shape {
void draw();
}
实现类
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
- 第二个特征-颜色
public interface Color {
void fill();
}
实现类
public class Red implements Color {
@Override
public void fill() {
System.out.println("Inside Red::fill() method.");
}
}
public class Green implements Color {
@Override
public void fill() {
System.out.println("Inside Green::fill() method.");
}
}
- 通过颜色与形状创建抽象类来获取工厂
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Shape getShape(String shape) ;
}
- 创建扩展了 AbstractFactory 的工厂类,基于给定的信息生成实体类的对象。
public class ShapeAndColorFactory extends AbstractFactory {
@Override
public Shape getShape(String shapeType){
if(shapeType == null){
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
}
return null;
}
@Override
public Color getColor(String color) {
if(color == null){
return null;
}
if(color.equalsIgnoreCase("RED")){
return new Red();
} else if(color.equalsIgnoreCase("GREEN")){
return new Green();
}
return null;
}
}
public class FactoryProducer {
public static AbstractFactory getFactory(String choice){
if(choice.equalsIgnoreCase("SHAPEANDCOLOR")){
return new ShapeAndColorFactory();
}
return null;
}
}
- 测试
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
ShapeAndColorFactory Factory = FactoryProducer.getFactory();
//获取形状为 Circle 的对象
Shape shape1 = Factory.getShape("CIRCLE");
//调用 Circle 的 draw 方法
shape1.draw();
Color color3 = Factory.getColor("BLUE");
//调用 Blue 的 fill 方法
color3.fill();
}
}