DesignPattern_工厂模式(工厂方法 抽象工厂)_02、03

简单工厂模式

基本介绍

简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单使用的模式
简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式

代码实现

/**
 * @author huangqh
 * @create 2020/9/10 0:42
 * @Note 简单工厂
 */
public class SimpleFactoryTest {
    
    
    public static void main(String[] args) {
    
    
        App qq = SendFactory.getInstance().create("QQ");
        qq.send("HHHHH");
        App weChat = SendFactory.getInstance().create("WeChat");
        weChat.send("OHHHHH");
    }
}
//Application 抽象类
 abstract class App{
    
    
    abstract void send(String msg);
}
//Application 实现类 WeChat
class Wechat extends App{
    
    
    void send(String msg) {
    
    
        System.out.println("Wechat send :"+msg);
    }
}
//Application 实现类  QQ
class QQ extends App{
    
    
    void send(String msg) {
    
    
        System.out.println("QQ send :"+msg);
    }
}
//
class SendFactory{
    
    
    //匿名内部类 单例
    private SendFactory(){
    
    }
    static class  InnerClass{
    
    
            private static final SendFactory INSTANCE =new SendFactory();
    }
    public static SendFactory getInstance(){
    
    

        return InnerClass.INSTANCE;
    }
    //根据传参 工厂创建不同对象
    App create(String app){
    
    
        if ("QQ".equals(app))
            return new QQ();
        else if ("WeChat".equals(app))
            return new Wechat();
        else
            return null;
    }
}

工厂方法模式

基本介绍

工厂方法模式:定义一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类

代码实现

/**
 * @author huangqh
 * @create 2020/9/11 0:18
 * @Note 工厂方法
 */
public interface Maker {
    
    
    void process(String material);
}

//生产键盘
class Keyboard implements Maker {
    
    
    public void process(String material) {
    
    
        System.out.println("use " + material + " maker keyboard");
    }
}

//生产鼠标
class Mouse implements Maker {
    
    
    public void process(String material) {
    
    
        System.out.println("use " + material + " maker mouse");
    }
}
//抽象工厂
abstract class Factory{
    
    
    //子类来实例化具体对象
    public abstract Maker maker();

    public void process(String material){
    
    
        Maker maker = maker();
        maker.process(material);
    }
}
class KeyboardFactory extends Factory{
    
    
    //键盘制造工厂,只需要提供键盘制造设备
    public Maker maker() {
    
    
        return new Keyboard();
    }
}
class MouseFactory extends Factory{
    
    
    //鼠标制造工厂,只需要提供鼠标制造设备
    public Maker maker() {
    
    
        return new Mouse();
    }
}

抽象工厂模式

基本介绍

抽象工厂模式:定义了一个interface用于创建相关或有依赖关系的对象簇,而无需指明具体实现的类
抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合
从设计层面看,抽象工厂模式就是对简单工厂模式的改进
将工厂抽象成两层,AbsFactory(抽象工厂)和具体实现的工厂子类。程序员可以根据对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂簇,更利于代码的维护和扩展

代码示例

/**
 * @author huangqh
 * @create 2020/9/11 1:03
 * @Note  键盘  联想键盘和惠普键盘是同一等级(类别)的产品  联想键盘和联想鼠标是同一个产品簇
 */
//机器:用于生产键盘
public interface KeyBoardMachine {
    
    
    public void process(String material);
}
//用于生产惠普键盘
class HPKeyBoard implements KeyBoardMachine{
    
    
    public void process(String material) {
    
    
        System.out.println("使用 "+material+" 生产惠普键盘");
    }
}
//用于生产联想键盘
class LenovoKeyBoard implements KeyBoardMachine{
    
    
    public void process(String material) {
    
    
        System.out.println("使用 "+material+" 生产联想键盘");
    }
}
//机器 用于生产鼠标
interface MouseMachine{
    
    
    public void process(String material);
}
//生产惠普鼠标
class HPMouse implements MouseMachine{
    
    
    public void process(String material) {
    
    
        System.out.println("使用 "+material+" 生产惠普鼠标");
    }
}
//生产联想鼠标
class LenovoMouse implements MouseMachine{
    
    
    public void process(String material) {
    
    
        System.out.println("使用 "+material+" 生产联想鼠标");
    }
}
//抽象工厂
abstract class Factory{
    
    
    //生产键盘
    abstract KeyBoardMachine produceKeyBoard();
    //生产鼠标
    abstract MouseMachine produceMouse();
}
//联想工厂    生产联想鼠标和键盘
class LenovoFactory extends Factory{
    
    
    KeyBoardMachine produceKeyBoard() {
    
    
        return new LenovoKeyBoard();
    }
    MouseMachine produceMouse() {
    
    
        return new LenovoMouse();
    }
}
//惠普工厂  生产惠普鼠标和键盘
class HPFactory extends Factory{
    
    

    KeyBoardMachine produceKeyBoard() {
    
    
        return new HPKeyBoard();
    }

    MouseMachine produceMouse() {
    
    
        return new HPMouse();
    }
}
class Test{
    
    
    public static void main(String[] args) {
    
    
        Factory lenovoFactory = new LenovoFactory();
        lenovoFactory.produceKeyBoard().process("亚克力");
        lenovoFactory.produceMouse().process("亚克力");
        Factory hpFactory = new HPFactory();
        hpFactory.produceKeyBoard().process("亚克力");
        hpFactory.produceMouse().process("亚克力");

    }
}

工厂模式小结

工厂模式的意义:将实例化对象的代码提取出来,放在一个类中同一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展性和维护性
三种工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式
设计模式的依赖抽象原则

创建对象实例时,不要直接new类,而是把这个new类的动作放在一个工厂的方法中,并返回,有的书上说,变量不要直接持有具体类的引用
不要让类继承具体类,而是继承抽象类或是实现interface
不要覆盖基类中已经实现的方法

猜你喜欢

转载自blog.csdn.net/qq_38438909/article/details/108505380