设计模式:工厂模式

总结: 

简单工厂:一个工厂,通过type类型创建不同产品

工厂方法:每个产品一个工厂

抽象工厂:每个产品族一个工厂

1、简单工厂

根据传入的name进行创建对象,增删一个对象都要修改if else分支,不符合开闭原则;

public class AnimalFactory {
    //简单工厂设计模式(负担太重、不符合开闭原则)
    public static Animal createAnimal(String name) {
        if ("cat".equals(name)) {
            return new Cat();
        } else if ("dog".equals(name)) {
            return new Dog();
        } else if ("cow".equals(name)) {
            return new Dog();
        } else {
            return null;
        }
    }
}

2、工厂方法

  1. 工厂方法模式就很好的减轻了工厂类的负担,把某一类/某一种东西交由一个工厂生产;(对应简单工厂的缺点1。
  2. 同时增加某一类 ”东西“ 并不需要修改工厂类,只需要添加生产这类 ”东西“ 的工厂即可,使得工厂类符合开放-封闭原则。
public interface PhoneFactory{
	public void makePhone();
}
 
public class IPhone implement PhoneFactory{
	public void makePhone(){
		System.out.println("Make a best IPhone ");
	}
}
 
public class Samsung implement PhoneFactory{
	public void makePhone(){
		System.out.println("Make a best Samsung ");
	}
}
 
public class Huawei implement PhoneFactory{
	public void makePhone(){
		System.out.println("Make a best Huawei ");
	}
}
public class Boss{
       public static void main(String[] args){
		PhoneFactory factory = new IPhone();
		factory.makePhone();
       }
}

3、抽象工厂

例如,汽车可以分为轿车、SUV、MPV等,也分为奔驰、宝马等。我们可以将奔驰的所有车看作是一个产品族,而将宝马的所有车看作是另一个产品族。分别对应两个工厂,一个是奔驰的工厂,另一个是宝马的工厂。与工厂方法不同,奔驰的工厂不只是生产具体的某一个产品,而是一族产品(奔驰轿车、奔驰SUV、奔驰MPV)。“抽象工厂”的“抽象”指的是就是这个意思。 即相比于工厂方法,抽象工厂定义了一系列的产品,而不是一个产品。

上边的工厂方法模式是一种极端情况的抽象工厂模式(即只生产一种产品的抽象工厂模式),而抽象工厂模式可以看成是工厂方法模式的一种推广。

//抽象形状类
public abstract class Shape {
    public abstract void sayShape();
}


//矩形类
public class Retangle extends Shape {
    
    @Overide
    public void sayShape() {
        System.out.println("Hi, I'm Retangle!");
    }
}


//圆形类
public class Circle extends Shape {


    @Overide
    public void sayShape() {
        System.out.println("Hi, I'm Circle!");
    }
}


//抽象颜色类
public abstract class Color {
    public abstract void sayColor();
}


//红色类
public class Red extends Color {
    @Overide
    public void sayColor() {
        System.out.println("Hi, I'm Red!");
    }
}


//白色类
public class White extends Color {
    @Overide
    public void sayColor() {
        System.out.println("Hi, I'm White!");
    }
}


//抽象工厂类
public abstract class ShapeFactory {


    public abstract Shape createShape();
    
    public abstract Color createColor();
}


//红色的圆
public class RedCircleFactory extends ShapeFactory {


    @Overide
    public Shape createShape() {
        return new Circle();
    }
    
    @Overide
    public Color createColor() {
        return new Red();
    }
}


//白色的圆
public class WhiteCircleFactory extends ShapeFactory {


    @Overide
    public Shape createShape() {
        return new Circle();
    }
    
    @Overide
    public Color createColor() {
        return new White();
    }
}