设计模式-工厂模式

ps:这只是锻炼我自己写博客的能力

一. 类之间的关系几种关系

实现,继承,组合,聚合,依赖

类之间的关系就是上面的几种

    1. 实现:接口和类之间的关系 can-do
    1. 继承: 类和类之间的关系 (接口和接口之间继承关系) is-a
    1. 组合:像台式机和cpu之间,比聚合关系更强 contains-a
    1. 聚合:暂时组装的关系 has-a
    1. 依赖:一个类用到另一个类,比如电脑类要执行发邮件方法,那么他可能依赖一个邮件类

二. 在设计模式中遵循的6大原则

  • 1.开闭原则:对扩展开放,对修改关闭.(一个稳定的功能不应该去修改其原有的代码,而是通过新增的方式进行扩展,依赖于接口或者抽象类实现)
  • 2.里氏替换原则:代码中任何基类出现的地方用任意子类可以进行替换,而不影响原来的功能
  • 3.依赖倒转原则:针对接口编程,依赖抽象而不是依赖于具体编程
  • 4.接口隔离原则:使用多个隔离的接口优于单一全面的接口
  • 5.迪米特原则:也就是最少知道原则,一个实体应尽量少的与其他实体发生作用
  • 6.合成复用原则:尽量使用合成/聚合的方式,而不是使用继承

三. 设计模式的解释

1.简单工程模式

简单工厂是一个大而全的工厂(上帝工厂),不管你需要什么都可以增加if-else if来达到生产出产品的目的. 但是简单工厂每增加一种产品就要修改代码(不满足开闭原则),工厂大而全缺乏同一的标准.

产品基类:

public abstract class Computer {
    protected String type;
    protected String brand;
    //省略无参构造器 有参构造器 getter setter方法
}
复制代码

具体产品类:


public class HaseeComputer extends Computer {
    public HaseeComputer(){
        this.brand="神船";
        this.type="笔记本";
    }
    public HaseeComputer(String type, String brand) {
        super(type, brand);
    }
}

public class LenovoComputer extends Computer {
    public LenovoComputer(){
        this.brand="联想";
        this.type="笔记本";
    }
    public LenovoComputer(String type, String brand) {
        super(type, brand);
    }
}

public class MiComputer extends Computer {
    public MiComputer() {
        this.brand="小米";
        this.type="笔记本";
    }
    public MiComputer(String type, String brand) {
        super(type, brand);
    }
}

复制代码

简单工厂:

public class SimpleFactory {

    public Computer createComputer(String name) {
        if ("lenovo".equals(name)) {
            return new LenovoComputer();
        } else if ("mi".equals(name)) {
            return new LenovoComputer();
        } else if ("hasee".equals(name)) {
            return new HaseeComputer();
        } else {
            return null;
        }
    }
}
复制代码

客户端:

public class Client {
    public static void main(String[] args) {

        //简单工厂
        SimpleFactory simpleFactory  = new SimpleFactory();
        Computer mi = simpleFactory.createComputer("mi");
        Computer lenovo = simpleFactory.createComputer("lenovo");
        Computer hasee = simpleFactory.createComputer("hasee");
        System.out.println(mi);
        System.out.println(lenovo);
        System.out.println(hasee);

    }
}
复制代码

2.工厂方法模式

工厂方法对公共的逻辑提取到了公共的父类中,然后每个产品有自己的工厂.不在根据客户端传递参数进行创建,一定程度上避免了出错.

工厂基类:

public interface MethodFactory {
    Computer createComputer();
}
复制代码

产品工厂:

public class LeovoMethodFactory implements MethodFactory {
    public Computer createComputer() {
        return new LenovoComputer();
    }
}
复制代码

产品工厂:

public class HaseeMethodFactory implements MethodFactory {
    public Computer createComputer() {
        return new HaseeComputer();
    }
}
复制代码

客户端:

public class Client {
    public static void main(String[] args) {

        MethodFactory haseeMethodFactory = new HaseeMethodFactory();
        Computer hasee = haseeMethodFactory.createComputer();

        MethodFactory methodFactory = new LeovoMethodFactory();
        Computer lenovo = methodFactory.createComputer();
        System.out.println(hasee);
        System.out.println(lenovo);
    }
}

复制代码

3.抽象工厂

随着产品的丰富,工厂方法的工厂类越来越多(原来只生产笔记本,但是现在各个厂家开始生产台式机了,如果每个都增加一个台式机的工厂,那么工厂类数量会变得很多). 工厂基类:

public interface StaticFactory {
    Computer createDesktop();
    Computer createNotebook();
}
复制代码

产品工厂:

public class HaseeStaticFactory implements StaticFactory {

    public Computer createDesktop() {
        HaseeComputer haseeComputer = new HaseeComputer();
        haseeComputer.setType("台式机");
        haseeComputer.setType("神船");
        return haseeComputer;
    }

    public Computer createNotebook() {
        HaseeComputer haseeComputer = new HaseeComputer();
        haseeComputer.setType("笔记本");
        haseeComputer.setType("神船");
        return haseeComputer;
    }
}
复制代码

产品工厂:

public class LenovoStaticFactory implements StaticFactory {

    public Computer createDesktop() {
        LenovoComputer  lenovoComputer  =new LenovoComputer();
        lenovoComputer.setBrand("联想");
        lenovoComputer.setType("台式机");
        return lenovoComputer;
    }

    public Computer createNotebook() {
        LenovoComputer  lenovoComputer  =new LenovoComputer();
        lenovoComputer.setBrand("联想");
        lenovoComputer.setType("笔记本");
        return lenovoComputer;
    }
}
复制代码

客户端:

public class Client {
    public static void main(String[] args) {
        StaticFactory haseeStaticFactory  = new HaseeStaticFactory();
        Computer haseeDesktop = haseeStaticFactory.createDesktop();
        Computer haseeNotebook = haseeStaticFactory.createNotebook();

        StaticFactory lenovoStaticFactory  = new LenovoStaticFactory();
        Computer lenovoDesktop = lenovoStaticFactory.createDesktop();
        Computer lenovoNotebook = lenovoStaticFactory.createNotebook();

        System.out.println(haseeDesktop);
        System.out.println(haseeNotebook);
        System.out.println(lenovoDesktop);
        System.out.println(lenovoNotebook);
    }
}
复制代码

转载于:https://juejin.im/post/5c35742de51d4551de1d8f54

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值