创建模式

Posted xyx960427

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建模式相关的知识,希望对你有一定的参考价值。

视频链接:https://www.bilibili.com/video/BV1Ze411p757/

什么是创建模式:

创建型模式用于处理对象的创建过程,即创建型模式抽象了实例化的过程,帮助一个系统独立于如何创建、组合以及表示它的对象

创建模式有哪些:

共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

实现方法:

一、工厂模式

  定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类

  适用:当一个类不知道它所必须创建的对象的类的时候

  类图:

技术图片

 

  例子代码:

技术图片
interface IProduct{}
class ProductA implements IProduct{}
class ProductB implements IProduct{}
interface IFactory{
    public IProduct getProduct();
}
class FactoryA implements IFactory{
    public IProduct getProduct(){
        return new ProductA();
    }
}
class FactoryB implements IFactory{
    public IProduct getProduct(){
        return new ProductB();
    }
}
// 工厂方法
class Factory {
    public IProduct getProductA(){
        return new ProductA();
    }
    public IProduct getProductB(){
        return new ProductB();
    }
    public IProduct getProduct(int type){
        if (type==1){
            return new ProductA();
        }else{
            return new ProductB();
        }
    }
}
public class TestFactory {
    public static void test(){
        IFactory factory = new FactoryA();
        IProduct product =factory.getProduct();
        // 
        factory = new FactoryB();
        product =factory.getProduct();
    }
}
技术图片

二、抽象工厂模式

  定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

  适用:一个系统要独立于它的产品的创建、组合和表示时

  与工厂模式的区别:工厂模式的一个工厂接口的子类只能实例化一个产品;抽象工厂能实例多个产品

  类图:

技术图片

 

  例子代码:

技术图片
// 产品1
interface IProduct1{} class Product1A implements IProduct1{} // 扩展产品1 B系列 class Product1B implements IProduct1{} // 产品2 interface IProduct2{} class Product2A implements IProduct2{} // 扩展产品2 B系列 class Product2B implements IProduct2{} // 工厂 interface IFactory{ public IProduct1 getProduct1(); public IProduct2 getProduct2(); }; // 工厂 A ,生产A系列产品 class FactoryA implements IFactory{ public IProduct1 getProduct1(){ return new Product1A(); }; public IProduct2 getProduct2(){ return new Product2A(); }; } // 工厂 B ,生产B系列产品 class FactoryB implements IFactory{ public IProduct1 getProduct1(){ return new Product1B(); }; public IProduct2 getProduct2(){ return new Product2B(); }; } public class testAbstractFactory { public void test(){ IFactory factory = new FactoryA(); IProduct1 product1A = (IProduct1)factory.getProduct1(); IProduct2 product2A = (IProduct2)factory.getProduct2(); // 如果扩展产品系列B时,添加 FactoryB、ProductB即可,不需要修改原来代码 factory = new FactoryB(); IProduct1 product1B = (IProduct1)factory.getProduct1(); IProduct2 product2B = (IProduct2)factory.getProduct2(); } }
技术图片

三、单例模式

  定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

  适用:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时

    类图:

技术图片

 

  例子代码:

技术图片
class Singleton {
    private static Singleton instance = null;
    // 防止被外部实例化
    private Singleton() {
    }
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
public class TestSingleton {
    public test(){
        // 获取单例
        Singleton singleton = Singleton.getInstance();
    }
}
技术图片

 四、构造者模式 

  定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

  适用:当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时

  类图:

技术图片

技术图片

  例子代码:

技术图片
class Person{
    private String name;
    private String address;
    private int age;
    private int sex;
    private int height;
    private int weight;
    public void setName(String name) {this.name = name;}
    public String getName() {return name;}
    public void setAddress(String address) {this.address = address;}
    public String getAddress() {return address;}
    public void setAge(int age) {this.age = age;}
    public int getAge() {return age;}
    public void setSex(int sex) {this.sex = sex;}
    public int getSex() {return sex;}
    public void setHeight(int height) {this.height = height;}
    public int getHeight() {return height;}
    public void setWeight(int weight) {this.weight = weight;}
    public int getWeight() {return weight;}
}
class PersonBuilder{
    private Person person;
    public PersonBuilder(){
        this.person = new Person();
    }
    public PersonBuilder name(String name){
        this.person.setName(name);
        return this;
    }
    public PersonBuilder address(String address){
        this.person.setAddress(address);
        return this;
    }
    public PersonBuilder age(int age){
        this.person.setAge(age);
        return this;
    }
    public PersonBuilder sex(int sex){
        this.person.setSex(sex);
        return this;
    }
    public PersonBuilder height(int height){
        this.person.setHeight(height);
        return this;
    }
    public PersonBuilder weight(int weight){
        this.person.setWeight(weight);
        return this;
    }
}
public class TestBuilder {
    public test(){
        PersonBuilder builder = new PersonBuilder();
        Person person = builder.name("lion")
                .address("america")
                .age(18)
                .sex(2)
                .height(180)
                .weight(150);
    }
}
技术图片

 五、原型模式

  定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

  适用:当要实例化的类是在运行时刻指定时;或者需要创建多个对象并且这些对象内部状态相差不大

  例子代码:

技术图片
class Car implements Cloneable{
    private int id;
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}

    public Car clone(){
        try {
            return (Car)super.clone();
        }catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}
class Prototype implements Cloneable{
    private int id;
    private Car car;
    public Car getCar() {return car;}
    public void setCar(Car car) {this.car = car;}
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}
    public Object clone(){
        try {
            boolean deep = true;
            if (deep){
                /**
                 * 深复制,复制出了两辆车
                 * */
                Prototype prototype = (Prototype)super.clone();
                prototype.setCar((Car)this.car.clone());
                // 继续复制其他引用对象
                return prototype;

            }else{
                /**
                 * 浅复制 ,是同一辆车
                 * */
                return super.clone();
            }
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}
public class TestPrototype {
    public void test(){
        Prototype p1 = new Prototype();
        p1.setCar(new Car());
        p1.setId(1);
        // 复制
        Prototype p2 = (Prototype)p1.clone();
        p2.setId(2);
    }
} 


以上是关于创建模式的主要内容,如果未能解决你的问题,请参考以下文章

用于从 cloudkit 检索单列的代码模式/片段

发生配置更改时如何不重置我的片段?

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段

尝试使用片段保存夜间模式状态

是否有在单个活动中处理多个片段的 Android 设计模式?

可以更新片段而不是创建新实例吗?