扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
直接在方法里写
创新互联公司的客户来自各行各业,为了共同目标,我们在工作上密切配合,从创业型小企业到企事业单位,感谢他们对我们的要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。专业领域包括成都网站设计、网站建设、电商网站开发、微信营销、系统平台开发。
public Room getRoom(){
Room room = new FourWallsRoom();//假设FourWallsRoom是你定义的一个Room子类
return room;
}
如果这是一个接口,你也可以写一个类来继承它,并实现getRoom方法
java有23种经典设计模式,分为三类:创建型、结构型和行为型。Builder,建造者,属于创建型的设计模式,相同的还有工厂方法模式、抽象工厂、单例模式和原型模式。建造者模式抽象了对象的实例化过程,用来帮助系统去创建、组合和表示实例对象。
建造者模式中一个常见的栗子就是StringBuilder。
建造者模式可以说是对工厂模式的扩展,工厂类提供了生产单个产品的功能,而建造者模式则可以将各种产品集中起来进行统一管理。工厂模式关注的是整个产品,建造者模式关注的是产品各组成部分的创建过程。
比如要创建一辆车,你只关心汽车本身(之后加以使用),就用工厂模式创建;若还关注该汽车的各部分是怎么造出来的(或者不同的工厂对产品的各部分的造法不同,就用Builder)。如StringBuilder对字符串的整合,append()、delete()、insert()改变数据。
一共23种设计模式!
按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。
创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。
创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:
工厂方法模式(Factory Method Pattern)
抽象工厂模式(Abstract Factory Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
单例模式(Singleton Pattern)
结构型模式用来处理类或者对象的组合,主要包含以下7种设计模式:
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
组合模式(Composite Pattern)
装饰者模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,主要包含以下11种设计模式:
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
策略模式(Strategy Pattern)
模板方法模式(Template Method Pattern)
访问者模式(Visitor Pattern)
推荐你一本好书:《软件秘笈:设计模式那点事》,里面讲解的23中设计模式例子很生动,容易理解,还有JDK中设计模式应用情况,看了收获挺大的!百度里面搜“设计模式”,第一条中设计模式百度百科中就有首推该图书,浏览量在20几万以上的,不会错的。好东西大家一起分享!
祝你早日学会设计模式!
建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式
实用范围
1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。[1]
2 当构造过程必须允许被构造的对象有不同表示时。
角色
在这样的设计模式中,有以下几个角色:
1 builder:为创建一个产品对象的各个部件指定抽象接口。
2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
3 Director:构造一个使用Builder接口的对象。
4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
例子
Builder
public interface PersonBuilder {
void buildHead();
void buildBody();
void buildFoot();
Person buildPerson();
}
//具体建造工具
ConcreteBuilder
public class ManBuilder implements PersonBuilder {
Person person;
public ManBuilder() {
person = new Person();
}
public void buildbody() {
person.setBody("建造男人的身体");
}
public void buildFoot() {
person.setFoot("建造男人的脚");
}
public void buildHead() {
person.setHead("建造男人的头");
}
public Person buildPerson() {
return person;
}
}
//建造者
Director
public class PersonDirector {
public Person constructPerson(PersonBuilder pb) {
pb.buildHead();
pb.buildBody();
pb.buildFoot();
return pb.buildPerson();
}
}
Product
public class Person {
private String head;
private String body;
private String foot;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
}
public class Man extends Person {
}
Test
public class Test{
public static void main(String[] args) {
PersonDirector pd = new PersonDirector();
Person person = pd.constructPerson(new ManBuilder());
System.out.println(person.getBody());
System.out.println(person.getFoot());
System.out.println(person.getHead());
}
}
result
建造男人的身体
建造男人的脚
建造男人的头
扩展
建造者模式在使用过程中可以演化出多种形式:
省略抽象建造者角色
如果系统中只需要一个具体的建造者的话,可以省略掉抽象建造者。这是代码可能如下:
class FoodManager
{
private:
BuilderA * builder;
public:
FoodManager() {builder = new BuilderA();};
void Construct()
{
builder-BuildRiceNoodles();
builder-BuildDrink();
builder-BuildCoolDish();
}
};
省略指导者角色
在具体建造者只有一个的情况下,如果抽象建造者角色已经被省略掉,那么还可以省略掉指导者角色,让Builder自己扮演指导者和建造者双重角色。这是代码可能如下:
//builder
class Builder
{
private:
Food * food;
public:
Builder(){food = new Food();}
void BuildRiceNoodles() {//..};
void BuildCoolDish(){//..};
void BuildDrink(){//..};
Food * getFood(){return food;}
void Construct()
{
BuildRiceNoodles();
BuildCoolDish();
BuildDrink();
}
};
同时,客户端也需要进行相应的调整,如下:
//client
int _tmain(int argc, _TCHAR* argv[])
{
Builder * builder = new Builder();
builder-Construct();
Food *food = builder-getFood();
food-show();
return 0;
}
C#中的StringBuilder就是这样一个例子。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流