设计模式(一)工厂模式实战

154 阅读3分钟

「这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战

设计模式的作用

提高代码可复用性可维护性可读性稳健性安全性

23种设计模式

创建型模式

单例模式、工厂模式、抽象工厂、建造者模式、原型模式

结构型模式

适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式

行为型模式

模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式

OOP七大原则

开闭原则:对扩展开放、对修改关闭

里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立

依赖倒置原则:要面向接口编程,不要面向实现编程。(细节依赖抽象,抽象不依赖细节)

单一职责原则:控制类的粒度大小,将对象接耦、提高内聚性

接口隔离原则:为各个类建立他们需要的专用接口

迪米特法则:只与朋友沟通,不与陌生人沟通

合成复用原则:尽量先试用组合或聚合等关联关系来实现,其次才考虑继承关系来实现。组合:has a 继承: is a

工厂模式

作用:实现了创建者和调用者分离

分类:简单工厂模式

工厂方法模式

抽象工厂模式

核心本质:实例化对象不使用new,用工厂方式替代。

将调用者与实现者接耦。对象的统一管理和控制。

简单工厂模式

public class SimpleFactory {
​
    // 创建宝马的实例
    public static Car getBMW() {
        Car bmw = new BMW();
        return bmw;
    }
    // 创建奔驰的实例
    public static Car getBenz() {
        Car benz = new Benz();
        return benz;
    }
​
​
    public static void main(String[] args) {
​
        Car bmw = SimpleFactory.getBMW();
        bmw.getBrand();
​
        Car benz = SimpleFactory.getBenz();
        benz.getBrand();
    }
}
​
interface Car {
​
    String getBrand();
}
​
class BMW implements Car {
​
    @Override
    public String getBrand() {
        System.out.println("品牌为宝马");
        return "BMW";
    }
}
​
class Benz implements Car {
    @Override
    public String getBrand() {
        System.out.println("品牌为奔驰");
        return "Benz";
    }
}

工厂方法模式

public class MethodFactory {
​
​
    public static void main(String[] args) {
        // 我想喝古茗奶茶
        GuMingMilkTeaFactory guMingFactory = new GuMingMilkTeaFactory();
        MilkTea guMing = guMingFactory.getMilkTea();
        guMing.getMilkTea();
​
        // 我想喝茶百道奶茶
        ChaBaiDaoMilkTeaFactory chaBaiDaoFactory = new ChaBaiDaoMilkTeaFactory();
        MilkTea chaBaiDao = chaBaiDaoFactory.getMilkTea();
        chaBaiDao.getMilkTea();
    }
}
​
/**
 * 定义一个奶茶工厂
 */
interface MilkTeaFactory {
​
    MilkTea getMilkTea();
}
​
class GuMingMilkTeaFactory implements MilkTeaFactory {
    @Override
    public MilkTea getMilkTea() {
        return new GuMingMilkTea();
    }
}
​
class ChaBaiDaoMilkTeaFactory implements MilkTeaFactory {
    @Override
    public MilkTea getMilkTea() {
        return new ChaBaiDaoMilkTea();
    }
}
​
​
​
interface MilkTea {
​
    void getMilkTea();
}
​
class GuMingMilkTea implements MilkTea {
​
    @Override
    public void getMilkTea() {
        System.out.println("古茗奶茶");
    }
}
​
class ChaBaiDaoMilkTea implements MilkTea {
    @Override
    public void getMilkTea() {
        System.out.println("茶百道奶茶");
    }
}

抽象工厂模式

public class AbstractFactory {
​
​
    public static void main(String[] args) {
        // 我想喝古茗奶茶
        GuMingFactory guMingFactory = new GuMingFactory();
        MilkTea guMingMilkTea = guMingFactory.getMilkTea();
        guMingMilkTea.getMilkTea();
​
        Juice guMingJuice = guMingFactory.getJuice();
        guMingJuice.getJuice();
​
        // 我想喝茶百道奶茶
        ChaBaiDaoFactory chaBaiDaoFactory = new ChaBaiDaoFactory();
        MilkTea chaBaiDaoMilkTea = chaBaiDaoFactory.getMilkTea();
        chaBaiDaoMilkTea.getMilkTea();
​
        Juice chaBaiDaoJuice = chaBaiDaoFactory.getJuice();
        chaBaiDaoJuice.getJuice();
    }
}
​
/**
 * 定义一个饮品工厂
 */
interface DrinkFactory {
​
    MilkTea getMilkTea();
    Juice getJuice();
}
​
class GuMingFactory implements DrinkFactory {
    @Override
    public MilkTea getMilkTea() {
        return new GuMingMilkTea();
    }
​
    @Override
    public Juice getJuice() {
        return new GuMingJuice();
    }
}
​
class ChaBaiDaoFactory implements DrinkFactory {
    @Override
    public MilkTea getMilkTea() {
        return new ChaBaiDaoMilkTea();
    }
​
    @Override
    public Juice getJuice() {
        return new ChaBaiDaoJuice();
    }
}
​
​
interface MilkTea {
​
    void getMilkTea();
}
​
class GuMingMilkTea implements MilkTea {
​
    @Override
    public void getMilkTea() {
        System.out.println("古茗奶茶");
    }
}
​
class ChaBaiDaoMilkTea implements MilkTea {
    @Override
    public void getMilkTea() {
        System.out.println("茶百道奶茶");
    }
}
​
interface Juice {
    void getJuice();
}
​
class GuMingJuice implements Juice {
    @Override
    public void getJuice() {
        System.out.println("古茗果汁");
    }
}
​
class ChaBaiDaoJuice implements Juice {
    @Override
    public void getJuice() {
        System.out.println("茶百道果汁");
    }
}