设计模式:工厂模式
总结:
简单工厂:一个工厂,通过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。
- 同时增加某一类 ”东西“ 并不需要修改工厂类,只需要添加生产这类 ”东西“ 的工厂即可,使得工厂类符合开放-封闭原则。
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();
}
}